如何使用放置在不同测试套件中单独文件中的sinon存根

时间:2018-07-19 16:43:31

标签: javascript node.js sinon chai

我正在通过将存根作为单独的文件放置在单独的文件夹中来组织存根,例如:

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 个答案:

答案 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');