Как издеваться над модулем npm с помощью sinon/mocha

Я пытаюсь протестировать функцию, которая вызывает модуль cors. Я хочу проверить, что cors будет вызываться. Для этого мне пришлось бы заглушить/издеваться над ним.

Вот функция cors.js

const cors = require("cors");

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

Моя идея тестирования такой функции была бы чем-то вроде

cors.test.js

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

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

    });
  });

Есть идеи, как заглушить модуль npm?


person Ndx    schedule 01.09.2019    source источник


Ответы (1)


Вы можете использовать mock-require или proxyquire

Пример с 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');
  });
});

Если вы хотите, вы можете определить макет поверх описания и сбросить шпиона, используя corsSpy.reset() между каждым тестом, а не издеваться и останавливать макет для каждого теста.

person Mickael B.    schedule 01.09.2019
comment
Я пробовал. И я получил, что это было вызвано 0 раз. - person Ndx; 02.09.2019
comment
@Ndx попробуйте setCors = mock.reRequire('.path/to/setCors'), как я писал в комментарии, модули кэшируются require, поэтому, если ваш модуль setCors потребовался до того, как вы попытаетесь смоделировать cors, вам нужно будет его reRequire. - person Mickael B.; 02.09.2019
comment
даже я всегда получаю один и тот же 0 .. не могу найти то, что я здесь пропустил :( - person Arundev; 01.12.2020