Express全局自定义函数foo在Jest测试中未定义问题
解决Jest测试中全局自定义函数
foo未定义的问题 你的问题核心是Jest测试环境未执行全局函数的挂载代码:开发时Express启动会加载src/Utils/index.ts,从而给global挂载foo;但Jest测试只会加载测试文件及其直接依赖的模块,不会自动加载全局初始化代码,导致调用foo()时抛出引用错误。
下面是三种可行的解决方式:
方式一:在测试文件中手动导入挂载模块
直接在测试文件开头导入src/Utils/index.ts,确保测试执行前全局函数已被挂载:
import "../../Utils/index"; import { test } from "./Example.module"; describe("modules/example", () => { describe("test", () => { it("returns bar", () => { let bar = test(); expect(bar).toBe("bar"); }); }); });
方式二:配置Jest全局初始化文件
如果多个测试文件都依赖全局函数,可通过Jest配置统一初始化:
- 创建测试初始化文件
src/testSetup.ts:
import "./Utils/index";
- 在Jest配置文件(如
jest.config.ts)中添加以下配置:
export default { // 其他已有配置... setupFilesAfterEnv: ["<rootDir>/src/testSetup.ts"], };
这样所有测试执行前都会自动加载该初始化文件,全局函数会被提前挂载。
方式三:在测试中模拟全局函数行为
如果不需要依赖真实的foo实现,可直接在测试中模拟全局函数:
import { test } from "./Example.module"; describe("modules/example", () => { // 在所有测试前模拟全局foo beforeAll(() => { global.foo = jest.fn(() => "bar"); }); describe("test", () => { it("returns bar", () => { const bar = test(); expect(bar).toBe("bar"); // 还可以验证函数是否被调用 expect(global.foo).toHaveBeenCalledTimes(1); }); }); });
内容的提问来源于stack exchange,提问作者Grover
相关产品推荐
相关产品推荐

