如何使用 sinon/mocha 模拟 npm 模块

Ndx*_*Ndx 7 mocking mocha.js node.js sinon sinon-chai

我正在尝试测试一个调用 module 的函数cors。我想测试那个cors会被调用。为此,我必须存根/模拟它。

这是函数 cors.js

const cors = require("cors");

const setCors = () => cors({origin: 'http//localhost:3000'});
module.exports = { setCors }
Run Code Online (Sandbox Code Playgroud)

我测试此类功能的想法类似于

cors.test.js

  describe("setCors", () => {
    it("should call cors", () => {
      sinon.stub(cors)

      setCors();
      expect(cors).to.have.been.calledOnce;

    });
  });
Run Code Online (Sandbox Code Playgroud)

知道如何存根 npm 模块吗?

Mic*_* B. 5

您可以使用mock-requireproxyquire

示例为mock-require

const mock = require('mock-require')
const sinon = require('sinon')

describe("setCors", () => {
  it("should call cors", () => {
    const corsSpy = sinon.spy();
    mock('cors', corsSpy);

    // Here you might want to reRequire setCors since the dependancy cors is cached by require
    // setCors = mock.reRequire('./setCors');

    setCors();
    expect(corsSpy).to.have.been.calledOnce;
    // corsSpy.callCount should be 1 here

    // Remove the mock
    mock.stop('cors');
  });
});

Run Code Online (Sandbox Code Playgroud)

如果您愿意,您可以在描述之上定义模拟,并corsSpy.reset()在每个测试之间使用重置间谍,而不是模拟并停止每个测试的模拟。

  • 我试过了。我发现它被调用了 0 次。 (3认同)