我模拟了一些nodejs模块(例如,其中一个是fs
)。我将它们放在__mocks__
文件夹(同一级别的node_modules
)文件夹中,并且模块模拟有效。但是,无论我使用哪个“在测试清除之间”选项,下一个测试都不是“沙盒”。怎么了?
模拟的fs
模块的一个非常简化的示例是:
// __mocks__/fs.js
module.exports = {
existsSync: jest.fn()
.mockReturnValueOnce(1)
.mockReturnValueOnce(2)
.mockReturnValueOnce(3)
}
我只是希望在每次测试中,每当调用init()
时(见下文),existsSync
都会再次从值1开始:jest.fn().mockReturnValue()
的第一个值。在测试文件中,我具有以下结构:
// init.test.js
const init = require("../init");
const { existsSync } = require("fs");
jest.mock("fs");
describe("initializes script", () => {
afterEach(() => {
// see below!
});
test("it checks for a package.json in current directory", () => {
init();
});
test("it stops script if there's a package.json in dir", () => {
init(); // should be run in clean environment!
});
}
再次非常简化了init.js文件
const { existsSync } = require("fs");
console.log("value of mocked response : ", existsSync())
在existsSync()
中运行init()
的第一次和第二次运行后,分别得到afterEach()
的以下结果:
1
,2
1
,undefined
1
,2
1
,undefined
有人知道我在做什么错吗?如何清除同一套件中测试之间的模块模拟?如有必要,我将乐意澄清。谢谢!
答案 0 :(得分:1)
重置模块,并在每次测试时再次要求它们:
describe("initializes script", () => {
afterEach(() => {
jest.resetModules()
});
beforeEach(() => {
jest.mock("fs");
})
test("it checks for a package.json in current directory", () => {
const init = require("../init");
init();
});
test("it stops script if there's a package.json in dir", () => {
const init = require("../init");
init();
});
}