摩卡:无法在另一个测试文件中已经需要的文件中存根功能



我正在使用Mocha在需要greeting.jsfileToTest.js上运行测试套件

// --fileToTest.js--
const { greeting } = require('./greeting');
module.exports = () => greeting();
// --greeting.js--
module.exports.greeting = () => 'hi!';

该测试文件本身成功地截断了greeting

// --test2.js--
let parent;
const sinon = require('sinon');
const chai = require('chai');
const greeting = require('../../greeting.js');
const { expect } = chai;
describe('stubbed /hi', () => {
before(async () => {
sinon.stub(greeting, 'greeting').callsFake((req, res, next) => 'bye!');
parent = require('../../parent.js');
});
after(async () => {
greeting.greeting.restore();
});
it('should say bye', async function () {
expect(parent()).to.be.equal('bye!');
});
});

但是,如果我运行一个测试套件,并且有另一个需要fileToTest.js的测试文件,比如下面的test1.js,那么上面的第一个测试(test2.js(将不会存根问候语。

// --test1.js--
const chai = require('chai');
const fileToTest = require('../../fileToTest.js');
const { expect } = chai;
describe('not stubbed /hi', () => {
it('should say hi', () => {
expect(fileToTest()).to.be.equal('hi!');
});
});

似乎一旦test1.js需要fileToTest,mocha就不会在test2.js的require上重新加载fileToTest。因此,fileToTest一直沿用着旧的问候功能。

在这种情况下,截断函数的正确方法是什么?

回购

这个答案奏效了。我不得不删除缓存。

before(async () => {
delete require.cache[require.resolve('../../fileToTest.js')]; // <------
sinon.stub(greeting, 'greeting').callsFake((req, res, next) => 'bye!');
fileToTest = require('../../fileToTest.js');
});

最新更新