首页 > 解决方案 > 添加 setupFilesAfterEnv 后,模拟函数在 .test 文件中不起作用

问题描述

在 jest.config.js 中添加setupFilesAfterEnv之后:

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

    setupFilesAfterEnv: ["./test/setupAfterEnv.ts"]  
}

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

模拟函数示例(.test.ts文件和setupAfterEnv.ts在同一个director中):

jest.mock("../src/service/sendEmail.ts", () => ({
    send: () => {
        return "MOCK sendEmail sent"
    }
}));

标签: node.jstypescriptjestjsts-jest

解决方案


文档状态

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

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

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


推荐阅读