在没有巴别塔的情况下从本机ES模块存根导出 [英] Stub an export from a native ES Module without babel
本文介绍了在没有巴别塔的情况下从本机ES模块存根导出的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在使用AVA+SINON构建我的单元测试。因为我需要ES6模块,而我不喜欢巴别塔,所以我在我的项目中使用了mjs文件,包括测试文件。我在开始项目时使用的是"--实验性模块"参数,在测试中使用的是"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模块添加存根?
推荐答案
According to John-David Dalton的创建者,只能更改*.js
文件的命名空间-*.mjs
文件被锁定。
这意味着SINON(和所有其他软件)不能存根这些模块--正如错误消息指出的那样。有两种方法可以解决此问题:
- 只需将文件的扩展名重命名为
.js
,即可更改导出。这是侵入性最小的,因为对于esm
,默认情况下mutableNamespace
选项为on。当然,这仅适用于使用esm
加载器的情况。 - 使用专用的模块加载器,该加载器可以代理所有导入并根据您的喜好替换它们。
proxyquire
或rewire
,这意味着当使用Proxyquire时,上面的测试将如下所示:
// assuming that `receiver` uses `factory` internally
// comment out the import - we'll use proxyquire
// import * as factory from '../src/factory';
// import { receiver } from '../src/receiver';
const factory = { backbone_factory: sinon.stub() };
const receiver = proxyquire('../src/receiver', { './factory' : factory });
将proxyquire示例修改为使用Qubble或ESMock(两者本身都支持ESM)应该很简单。
这篇关于在没有巴别塔的情况下从本机ES模块存根导出的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文