首页 > 解决方案 > 如何使用放置在不同测试套件中单独文件中的 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 文件之前使用的缓存被返回,并且在它完成时返回恢复存根,因此在另一个测试文件中它再次成为正常的非存根函数。

存根如何保存在单独的文件中并在其他测试文件中再次使用。

标签: javascriptnode.jschaisinonstub

解决方案


您可以重置模块注册表 - 所需模块的缓存。因此,您可以从 mocha挂钩中的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)

推荐阅读