我正在使用AVA + sinon来构建我的单元测试。因为我需要ES6模块,而且我不喜欢babel,所以我在整个项目中使用mjs文件,包括测试文件。我使用“--experimental-modules”参数来启动我的项目,并在测试中使用“esm”包。以下是我的ava配置和测试代码。
"ava": {
"require": [
"esm"
],
"babel": false,
"extensions": [
"mjs"
]
},
// test.mjs
import test from 'ava';
import sinon from 'sinon';
import { receiver } from '../src/receiver';
import * as factory from '../src/factory';
test('pipeline get called', async t => {
const stub_factory = sinon.stub(factory, 'backbone_factory');
t.pass();
});
但我收到错误消息:
TypeError {
message: 'ES Modules cannot be stubbed',
}
我怎样才能在没有巴别塔的情况下使ES6模块失效?
3条答案
按热度按时间ymzxtsji1#
根据esm package的创建者John-David道尔顿的说法,只能改变
*.js
文件的命名空间-*.mjs
文件被“锁定”。这意味着Sinon(以及所有其他软件)无法存根这些模块-正如错误消息所指出的。有两种方法可以解决这个问题:
1.只需将文件的扩展名重命名为
.js
,以使导出的文件可变,这是最小的侵入性,因为mutableNamespace
选项在esm
中默认为 on,当然,这仅适用于使用esm
加载程序时。1.使用一个专用的模块加载器来代理所有的导入,并用您喜欢的一个来替换它们。
选项2的技术栈不可知术语是link seam--基本上取代了Node的默认模块加载器。通常可以使用Quibble、ESMock、
proxyquire
或rewire
,这意味着使用Proxyquire时上面的测试看起来像这样:修改proxyquire示例以使用Quibble或ESMock(两者都原生支持ESM)应该很简单。
mqxuamgl2#
Sinon需要与时俱进,否则就会落后(ESM is becoming defacto now with Node 12),因为由于其许多限制,使用它将是一个巨大的痛苦。
This article提供了一个变通方法(实际上是4个,但我只发现1个是可以接受的)。在我的例子中,我直接从模块中导出函数,并得到以下错误:ES模块无法存根化
解决方案是将函数放入一个类中,然后将其导出:
注意,在方法语法中删除了
function
关键字。快乐编码-希望西农使它在长期运行,但它看起来不太好,因为它过于僵化。
zujrkrfu3#
坚持提问Headline**Stub a export from a native ES Module without babel "**这是我的看法,使用摩卡和esmock:
(致谢:当然@oligofren把我带到了正确的道路上......)
关于测试1
关于测试1
sonFoo
到sonBar
)保持原样,它们实际上是closure,仍然指向前一个函数