使用Jest测试GraphQL API时Raven抛出警告问题
解决Jest测试GraphQL API时的Raven环境误判警告
我来帮你搞定这个烦人的警告!这个问题的核心是Raven(Sentry的Node.js SDK)把你的Jest测试环境误判成了浏览器环境,触发点就是你自定义错误类里调用的logError方法——它应该是在使用Raven上报错误,但Jest的默认配置让Raven搞错了运行环境。
下面是几个针对性的解决办法,按推荐程度排序:
1. 把Jest测试环境切换为Node.js
如果你的GraphQL API是Node后端服务,Jest默认的jsdom(浏览器模拟环境)完全没必要,直接改成Node环境就能从根源避免Raven的误判:
- 在项目根目录的
jest.config.js里添加配置:module.exports = { testEnvironment: 'node', // 其他Jest配置... }; - 如果只是个别测试文件需要改环境,也可以在文件顶部加注释:
/** @jest-environment node */ // 你的测试代码...
2. 测试时Mock掉logError方法
既然是测试环节,你肯定不想真的把错误上报到Sentry对吧?直接用Jest的mock功能把logError替换成空函数,既不会触发Raven的初始化,也能正常测试你的自定义错误类:
// 在你的测试文件顶部 jest.mock('./errors', () => ({ logError: jest.fn() // 替换成一个空的jest函数 }));
之后你还能通过logError.mock.calls来验证它是否被正确调用,一举两得。
3. 强制指定Raven的运行平台
如果必须在测试中保留Raven的调用,可以在初始化Raven时明确告诉它这是Node环境:
// 假设你的logError里是这样初始化Raven的 const Raven = require('raven'); Raven.config('你的Sentry DSN', { platform: 'node', // 强制指定为Node平台 environment: 'test' // 标记为测试环境,方便Sentry区分 }).install();
小插曲:修复你的自定义Error类
看你提供的代码片段,LoggedErrorClass的constructor里super的调用好像没写完,这里顺便给你补全规范写法,确保自定义错误的instanceof判断正常:
import logError from './errors'; class LoggedErrorClass extends Error { constructor(error) { logError(error); // 根据error类型传递正确的message super(typeof error === 'string' ? error : error.message); // 确保原型链正确,否则instanceof LoggedErrorClass会失效 Object.setPrototypeOf(this, new.target.prototype); // 可选:自定义错误名称 this.name = 'LoggedError'; } }
内容的提问来源于stack exchange,提问作者Le garcon
相关产品推荐
相关产品推荐

