在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
相关产品推荐
相关产品推荐

