gpt4 book ai didi

sinon - 从没有 babel 的 ES6 模块 stub 函数

转载 作者:行者123 更新时间:2023-12-04 13:44:47 24 4
gpt4 key购买 nike

我正在使用 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',
}

如何在没有 babel 的情况下 stub ES6 模块?

最佳答案

According to John-David Dalton@esm的创造者包,只能改变 *.js 的命名空间文件 - *.mjs文件被锁定。

这意味着 Sinon(和所有其他软件)无法 stub 这些模块 - 正如错误消息指出的那样。您可以尝试使用 link seam , 使用 proxyquirerewire ,这意味着上面的测试将是这样的:

// 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 });

不过,由于上述原因,我不能 100% 确定这有效,但值得一试。

旧答案 - 仅适用于 *.js文件(不是 *.mjs )。

您需要将一个选项传递给 esm这将允许您拥有可变的命名空间。 ES 模块默认是不可变的,这意味着 Sinon 不能做 zilch。

该选项名为 cjs.mutableNamespace , 在 README 中有描述并将修改 Node 的运行时以允许您更改导出。

您如何启用该选项取决于您如何加载 esm ,但自述文件说: // Set options as a parameter, environment variable, or rc file.
由于您不自己加载模块,我假设环境变量或 rc 文件是您唯一的两个选择。在 env 变量中填充 json 可能会很困惑,所以我建议在名为 .esmrc.json 的文件中填充以下内容:
{
"cjs": {
"mutableNamespace": "true"
}
}

我从未将选项传递给 esm我自己,所以不知道它是否无需修改就可以运行,并且上面的代码不能单独运行,这意味着我无法在您的情况下对其进行测试,但我认为它应该是正确的。

编辑: mutableNamespace option 是默认值,因此没有必要指定它。

关于sinon - 从没有 babel 的 ES6 模块 stub 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50763323/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com