如何使用quibble模拟esm模块功能

问题描述 投票:0回答:1

使用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
javascript node.js unit-testing mocha.js sinon
1个回答
0
投票

我在这里有一个完整的 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 负责自行加载。

© www.soinside.com 2019 - 2024. All rights reserved.