如何在Jest的同一测试套件中的测试之间清除模块模拟?

时间:2018-09-28 18:50:08

标签: javascript node.js unit-testing jestjs

我模拟了一些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()的以下结果:

  • jest.resetModules():12
  • existsSync.mockReset():1undefined
  • existsSync.mockClear():12
  • existsSync.mockRestore():1undefined

有人知道我在做什么错吗?如何清除同一套件中测试之间的模块模拟​​?如有必要,我将乐意澄清。谢谢!

1 个答案:

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