添加 setupFilesAfterEnv 后,模拟函数在 .test 文件中不起作用

Amr*_*war 3 node.js typescript jestjs ts-jest

在 jest.config.js 中添加setupFilesAfterEnv后,如下所示:

module.exports = {
    preset: 'ts-jest',
    testEnvironment: 'node',

    setupFilesAfterEnv: ["./test/setupAfterEnv.ts"]  
}
Run Code Online (Sandbox Code Playgroud)

模拟函数在文件中不再起作用,.test.ts但在 setupFilesAfterEnv 内写入的文件中起作用,例如./test/setupAfterEnv.ts

模拟函数示例(.test.ts文件和setupAfterEnv.ts同一目录中):

jest.mock("../src/service/sendEmail.ts", () => ({
    send: () => {
        return "MOCK sendEmail sent"
    }
}));
Run Code Online (Sandbox Code Playgroud)
  • 我没有收到任何错误,并且应该模拟的其他函数运行。当我在模拟函数中写入错误的路径时,出现错误can't find module。所以看起来它找到了应该被模拟的函数,但不运行模拟函数而是运行另一个函数

  • 如果我评论了setupFilesAfterEnv配置,jest.config.js 它会再次起作用。

小智 9

文件说明

警告:在安装文件中导入模块
(由 setupTestFrameworkScriptFile 指定)
将防止对有问题的模块进行模拟,
以及它导入的所有模块。

如果您的 ./test/setupAfterEnv.ts 中有任何导入/需要,它们可能会导入其他文件,并且该过程中导入的任何链都将无法模拟('../somemodule'); 在测试中。

我不知道为什么会有这样的限制;如果您在 setupAfterEnv.ts 文件本身中调用 mock('../somemodule') ,它将在稍后的测试中被模拟。但我认为这很糟糕,因为只有一些测试可能想要模拟某些模块,而其他测试则希望它们不被模拟。可惜了。就我而言,我想导入 typeorm 库并连接到数据库。但是创建此连接的类导入我们所有的实体,并且所有实体类导入其他类,这些类导入其他类等等......所以没有什么可以模拟的。由于此限制根本无法使用。