我正在通过将存根作为单独的文件放置在单独的文件夹中来组织存根,例如:
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文件先前使用的缓存,并在其返回时返回完成后,它将恢复存根,因此在另一个测试文件中,它又是正常的非存根功能。
如何将存根保存在单独的文件中,并在其他测试文件中再次使用。
答案 0 :(得分:0)
您可以重置模块注册表 - 所需模块的缓存。因此,您可以从 mocha student_names
挂钩中的 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');