我正在试用Stitch,这是一个来自MongoDB的无服务器/托管的MongoDB环境。我的主要目的是帮助我学习现代JavaScript,但我也在尝试编写一个有用的应用程序。
我编写了以下函数,并将其保存在我的Stitch应用程序中。我相信这遵循了用Stitch编写函数的记录方式,并且我已经在Stitch管理控制台上测试了它:
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,并编写了以下测试函数:
const callApi = require('./source');
test('Simple fetch with no user', () => {
expect(callApi('hello')).toBe(123);
});这将失败,但有以下错误:
~ # 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入门文档中,有人必须这样做:
module.exports = function() { ... }然而,Stitch文档似乎需要将函数定义为:
exports = function() { ... }我没有JavaScript的背景来理解两者之间的区别。我可以尝试module.exports在Stitch,但我宁愿不,因为这不是现在不工作,或造成破坏在未来。是否可以指示Jest在没有exports前缀的情况下“看到”裸module?
顺便说一句,我之所以选择Jest,是因为它很受欢迎,也因为我的一些JavaScript同事为之担保。但是,我不喜欢它,如果知道它对Stitch开发更好的话,我很乐意使用其他的东西。
更新
根据下面jperl提供的有用答案,我发现在Stitch中不可能使用以下结构:
module.exports = exports = function() {}我也不能这样做:
exports = function() {}
module.exports = exports如果我尝试这两种方法之一,都会得到以下错误:
函数验证期间的
运行时错误
因此,看起来我必须让Jest在没有module.exports的情况下工作,或者创建一个将exports版本导入到module.exports中的胶水文件,主文件由Stitch使用,而胶水导入程序则由Jest使用。
发布于 2019-12-07 17:50:55
我建议你读一下这个thread。你认为这与modules.exports对exports的关系是对的。问题是,module.exports和exports首先指出的是同一件事情。所以像这样的东西起作用了:
//modify the same object that modules.exports is pointing to
exports.a = {}
exports.b = {}但这不会:
exports = {}为什么?因为现在exports指向了module.exports以外的其他东西,所以您正在做的事情根本没有任何影响。
更新
在注释中进行了一些更新之后,我们认为Stitch似乎不支持Jest所需的导出格式。
发布于 2019-12-22 19:43:36
这是jperl的回答的增编,以展示我是如何在尊重史提奇的限制的同时让Jest工作的。
首先,值得注意的是,如何布局一个Stitch应用程序。这是由导入/导出格式决定的。
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可能会忽略下划线文件,因为它们总是会生成):
_source.js
config.json
source.js
source.test.js为了创建突出显示的副本,我使用了这个shell脚本:
#!/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也许有点烦躁,但很管用!
https://stackoverflow.com/questions/59228616
复制相似问题