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

在TypeScript/NodeJS中用Jest框架Mock Sentry遇问题求助

解决Jest Mock Sentry Handlers时的"requestHandler is not a function"错误

问题场景

在NodeJS项目中集成Sentry后,添加了以下两个中间件:

const app: express.Express = express();

Sentry.init({
    dsn: process.env.SENTRY_DSN_SERVER,
    serverName: process.env.SERVER_NAME,
    environment: process.env.NODE_ENV,
    tracesSampleRate: 1.0,
    integrations: [
        new RewriteFrames({
            root: global.__dirname,
        }),
    ],
});

app.use(Sentry.Handlers.requestHandler());
app.use(Sentry.Handlers.tracingHandler());

// 后续路由代码

尝试Mock Sentry时,使用了以下代码导致报错Sentry.Handlers.requestHandler is not a function:

jest.mock("@sentry/node", () => ({
    init: () => jest.fn(),
     Handlers: () => {
        return {
            requestHandler: () => jest.fn(),
            tracingHandler: () => jest.fn(),
        };
    },
}));

jest.mock("@sentry/integrations");
jest.mock("@sentry/tracing", () => () => jest.fn());

错误原因

代码中将Handlers定义成了函数,但实际Sentry导出的Handlers是一个静态对象。调用Sentry.Handlers.requestHandler()时,相当于试图访问一个函数的requestHandler属性,自然会抛出“不是函数”的错误。

正确的Mock写法

调整Handlers的定义为普通对象,同时修正init和RewriteFrames的Mock逻辑:

jest.mock("@sentry/node", () => ({
    init: jest.fn(),
    Handlers: {
        // 每个Handler返回一个mock的Express中间件函数
        requestHandler: jest.fn(() => jest.fn()),
        tracingHandler: jest.fn(() => jest.fn()),
    },
}));

// 显式Mock RewriteFrames构造函数,避免测试时找不到
jest.mock("@sentry/integrations", () => ({
    RewriteFrames: jest.fn()
}));

jest.mock("@sentry/tracing", () => jest.fn());

补充说明

  • Sentry.init本身是一个函数,直接用jest.fn()Mock即可,不需要嵌套() => jest.fn()。
  • 由于业务代码中使用了new RewriteFrames,必须在@sentry/integrations的Mock中显式导出这个构造函数,否则测试会因找不到该类而失败。

内容的提问来源于stack exchange,提问作者swateek

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 21:10:12