You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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配置统一初始化:

  1. 创建测试初始化文件src/testSetup.ts:
import "./Utils/index";
  1. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 18:55:17