首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何让Jest看到我为MongoDB Stitch编写的函数?

如何让Jest看到我为MongoDB Stitch编写的函数?
EN

Stack Overflow用户
提问于 2019-12-07 17:37:21
回答 2查看 220关注 0票数 1

我正在试用Stitch,这是一个来自MongoDB的无服务器/托管的MongoDB环境。我的主要目的是帮助我学习现代JavaScript,但我也在尝试编写一个有用的应用程序。

我编写了以下函数,并将其保存在我的Stitch应用程序中。我相信这遵循了用Stitch编写函数的记录方式,并且我已经在Stitch管理控制台上测试了它:

代码语言:javascript
复制
exports = function(query){
  const http = context.services.get("HTTP");
  const urlBase = context.values.get("stackOverflowApiUrl");
  const options = [
    'order=desc',
    'sort=activity',
    'site=stackoverflow',
    'q=' + encodeURIComponent(query),
    'user=472495',
    'filter=!--uPQ.wqQ0zW'
  ];

  return http
    .get({ url: urlBase + '?' + options.join('&') })
    .then(response => {
      // The response body is encoded as raw BSON.Binary. Parse it to JSON.
      const ejson_body = EJSON.parse(response.body.text());
      return ejson_body.total;
    });
};

这段代码非常简单--它获得了一个http对象,用于获取外部API,并获得一个配置值,以便urlBase与之联系(解析为https://api.stackexchange.com/2.2/search/excerpts),然后调用堆栈溢出数据API。这将对我的用户运行一个搜索查询,并返回结果的数量。

到目前一切尚好。现在,我想在本地调用这个函数,在Jest中。为此,我在本地Docker容器中安装了Node和Jest,并编写了以下测试函数:

代码语言:javascript
复制
const callApi = require('./source');

test('Simple fetch with no user', () => {
    expect(callApi('hello')).toBe(123);
});

这将失败,但有以下错误:

代码语言:javascript
复制
~ # jest
 FAIL  functions/callApi/source.test.js
  ✕ Simple fetch with no user (3ms)

  ● Simple fetch with no user

    TypeError: callApi is not a function

      2 | 
      3 | test('Simple fetch with no user', () => {
    > 4 |     expect(callApi('hello')).toBe(123);
        |            ^
      5 | });
      6 | 

      at Object.<anonymous>.test (functions/callApi/source.test.js:4:12)

Test Suites: 1 failed, 1 total
Tests:       1 failed, 1 total
Snapshots:   0 total
Time:        1.418s
Ran all test suites.

(实际上,我以为它会失败,因为它包含一个Jest无法访问的全局对象context。稍后,我将研究如何模拟这个函数,但目前Jest甚至根本看不到这个函数)。

我想我可以看出原因--在Jest入门文档中,有人必须这样做:

代码语言:javascript
复制
module.exports = function() { ... }

然而,Stitch文档似乎需要将函数定义为:

代码语言:javascript
复制
exports = function() { ... }

我没有JavaScript的背景来理解两者之间的区别。我可以尝试module.exports在Stitch,但我宁愿不,因为这不是现在不工作,或造成破坏在未来。是否可以指示Jest在没有exports前缀的情况下“看到”裸module

顺便说一句,我之所以选择Jest,是因为它很受欢迎,也因为我的一些JavaScript同事为之担保。但是,我不喜欢它,如果知道它对Stitch开发更好的话,我很乐意使用其他的东西。

更新

根据下面jperl提供的有用答案,我发现在Stitch中不可能使用以下结构:

代码语言:javascript
复制
module.exports = exports = function() {}

我也不能这样做:

代码语言:javascript
复制
exports = function() {}
module.exports = exports

如果我尝试这两种方法之一,都会得到以下错误:

函数验证期间的

运行时错误

因此,看起来我必须让Jest在没有module.exports的情况下工作,或者创建一个将exports版本导入到module.exports中的胶水文件,主文件由Stitch使用,而胶水导入程序则由Jest使用。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-12-07 17:50:55

我建议你读一下这个thread。你认为这与modules.exportsexports的关系是对的。问题是,module.exportsexports首先指出的是同一件事情。所以像这样的东西起作用了:

代码语言:javascript
复制
//modify the same object that modules.exports is pointing to
exports.a = {}
exports.b = {}

但这不会:

代码语言:javascript
复制
exports = {}

为什么?因为现在exports指向了module.exports以外的其他东西,所以您正在做的事情根本没有任何影响。

更新

在注释中进行了一些更新之后,我们认为Stitch似乎不支持Jest所需的导出格式。

票数 1
EN

Stack Overflow用户

发布于 2019-12-22 19:43:36

这是jperl的回答的增编,以展示我是如何在尊重史提奇的限制的同时让Jest工作的。

首先,值得注意的是,如何布局一个Stitch应用程序。这是由导入/导出格式决定的。

代码语言:javascript
复制
auth_providers/
functions/
    function_name_1/
        config.json
        source.js
    function_name_2/
        config.json
        source.js
    ...
services/
values/

config.json文件由Stitch远程创建,并通过导出获得。这包含ID信息,以唯一标识同一文件夹中的函数。

我相信将测试与源代码混在一起是常见的JavaScript实践,所以我遵循这种风格(我是现代JS的新手,我承认我觉得这种风格不整洁,但我还是在使用它)。因此,我在每个函数文件夹中添加了一个source.test.js文件。

最后,由于Stitch需要什么和Jest需要什么之间存在差异,我编写了一个脚本,在每个函数文件夹中在_source.js下创建一个源代码文件。

因此,每个文件夹都将包含这些文件( Git可能会忽略下划线文件,因为它们总是会生成):

代码语言:javascript
复制
_source.js
config.json
source.js
source.test.js

为了创建突出显示的副本,我使用了这个shell脚本:

代码语言:javascript
复制
#!/bin/bash

# Copy all source.js files as _source.js
for f in $(find functions/ -name source.js); do cp -- "$f" "$(dirname $f)/_$(basename $f)"; done

# Search and replace in all _source.js files
for f in $(find functions/ -name _source.js); do sed -i -e 's/exports =/module.exports =/g' $f; done

也许有点烦躁,但很管用!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59228616

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档