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

axm*_*m__ 5 javascript unit-testing node.js jestjs

我嘲笑了一些 nodejs 模块(例如,其中之一是fs)。我将它们放在一个__mocks__文件夹(同一级别 als node_modules)文件夹中,并且模块模拟工作。但是,无论我使用哪个“测试清除之间”选项,下一个测试都不是“沙盒化”的。这里出了什么问题?

fs模拟模块的一个非常简化的示例是:

// __mocks__/fs.js
module.exports = {
    existsSync: jest.fn()
        .mockReturnValueOnce(1)
        .mockReturnValueOnce(2)
        .mockReturnValueOnce(3) 
}
Run Code Online (Sandbox Code Playgroud)

我只是期望在每次测试中,无论何时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!
    });
}
Run Code Online (Sandbox Code Playgroud)

再次非常简化,init.js 文件

const { existsSync } = require("fs");
console.log("value of mocked response : ", existsSync())
Run Code Online (Sandbox Code Playgroud)

existsSync()在第一次和第二次运行后init()分别得到以下结果afterEach()

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

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

Ale*_*ela 6

重置模块并为每个测试再次要求它们:

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();
    });
}
Run Code Online (Sandbox Code Playgroud)

  • 开玩笑的模拟电话不会被挂起吗(在大多数情况下)?这意味着即使您将 jest.mock 嵌套在 beforeEach 中,模拟也会在文件之前运行。参考:https://jestjs.io/docs/jest-object#jestdomockmodulename-factory-options (3认同)
  • 我可能正在使用旧版本,因为他们[同年发布了一个新的主要版本,默认情况下会提升模拟](https://github.com/facebook/jest/blame/48cda778b285d32e47b3a1bae0f64fffe6601ce0/CHANGELOG.md#L2657) ,该代码确实有效,但你是对的,它不会在较新的版本上。 (2认同)