Как использовать заглушки 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)