Как использовать заглушки sinon, размещенные в отдельных файлах в разных тестовых пакетах

Я организую заглушки, помещая их в отдельную папку как отдельный файл, например:

test
 |_____ create.test.js
 |_____ dochelp.test.js
stubs
 |_____ input.js

Вот код для заглушки input.js

const sinon = require('sinon');
const input = require('../../utils/input');


module.exports = sinon.stub(input, 'getInput')

Вот код в create.test.js

const inputStub = require('./stubs/input');
inputStub.resolves(true);

describe('suite', () => {
   //... same code is in dochelp.test.js
   after(() => {
      inputStub.restore();
   })
})

Поскольку require кеширует модуль после разрешения, так что всякий раз, когда другой тестовый файл требует заглушку, он возвращает модуль кеша, и поэтому кеш, который ранее использовался файлом create.test.js, возвращается и к моменту его завершения восстанавливает заглушку, так что в другом тестовом файле это снова нормальная функция, не являющаяся заглушкой.

Как сохранить заглушки в отдельном файле и повторно использовать в других тестовых файлах.

1 ответ

Вы можете сбросить реестр модуля - кэш нужного модуля. Итак, вы можете удалить ключ из объекта require.cache в мокко beforeкрюк.

Модули кэшируются в этом объекте, когда они требуются. Удалив значение ключа из этого объекта, следующий requireперезагрузит модуль.

Полный рабочий пример:

test/create.test.js:

      const chai = require('chai');
const chaiAsPromised = require('chai-as-promised');
const { resetModule } = require('../utils/test');
chai.use(chaiAsPromised);
const { expect } = chai;

describe('create test suite', () => {
  let inputStub;
  before(() => {
    resetModule();
    inputStub = require('../stubs/input');
    inputStub.resolves(true);
  });
  after(() => {
    inputStub.restore();
  });
  it('should pass', async () => {
    await expect(inputStub()).to.eventually.be.true;
  });
});

test/dochelp.test.js:

      const chai = require('chai');
const chaiAsPromised = require('chai-as-promised');
const { resetModule } = require('../utils/test');
chai.use(chaiAsPromised);
const { expect } = chai;

describe('dochelp test suite', () => {
  let inputStub;
  before(() => {
    resetModule();
    inputStub = require('../stubs/input');
    inputStub.resolves(false);
  });
  after(() => {
    inputStub.restore();
  });
  it('should pass', async () => {
    await expect(inputStub()).to.eventually.be.false;
  });
});

utils/input.js:

      const input = {
  async getInput() {
    return 'real input';
  },
};

module.exports = input;

utils/test.js:

      function resetModule() {
  delete require.cache[require.resolve('../stubs/input')];
}

module.exports = { resetModule };

stubs/input.js:

      const sinon = require('sinon');
const input = require('../utils/input');

module.exports = sinon.stub(input, 'getInput');

результат модульного теста:

      ⚡  npx mocha ./test/*.test.js


  create test suite
    ✓ should pass

  dochelp test suite
    ✓ should pass


  2 passing (469ms)
Другие вопросы по тегам