使用quibble模拟和测试类似的esm方法是否可行?如果没有,我们还有其他库吗?
Sinon 很好,但是 es 模块不能用 sinon 进行存根。我从这个SO答案中发现了狡辩。
我要测试的文件:
module.mjs
export function getNumber() {
return 10;
}
export function adder() {
const a = getNumber();
const b = getNumber();
return a + b;
}
测试该文件:
module.test.mjs
import { expect } from "chai";
import quibble from "quibble";
import { adder } from "./module.js";
// passing
it("testing adder", () => {
const result = adder();
expect(result).to.equal(20);
});
// failing
it("mocked test", async () => {
await quibble.esm("./module.js", {
getNumber: () => 30,
});
const result = adder();
expect(result).to.equal(60); // still returns 20
});
$ mocha --loader=quibble "**/*/module.test.js"
✔ testing adder
1) mocked test
1 passing (9ms)
1 failing
1) mocked test:
AssertionError: expected 20 to equal 60
+ expected - actual
-20
+60
我在这里有一个完整的 Quibble 工作示例:https://github.com/fatso83/sinon-swc-bug/tree/esm-no-ts
对于 TypeScript,我无法使其与 SWC 一起工作,因此我必须使用 TestDouble(它只是包装 Quibble):https://github.com/fatso83/sinon-swc-bug/tree/ts-esm
这是我的示例中的相关部分。适应起来应该很简单:
import "./init.js";
import { expect } from "chai";
import quibble from "quibble";
import sinon from "sinon";
const sandbox = sinon.createSandbox();
describe("main module", () => {
let mocked, main;
before(async () => {
mocked = sandbox.fake.returns("mocked");
await quibble.esm("./other.js", { toBeMocked: mocked });
const mainModule = await import("./main.js");
main = mainModule.main;
});
it("should mock", () => {
main();
expect(mocked.called).to.be.true;
});
});
Node 版本 > 20.6 时不需要任何额外的配置:Quibble/TestDouble 负责自行加载。