升级Jest至29.5.*后NestJS单元测试报错:Cannot read properties of undefined '*request'
解决方案:Jest 29.5.x 升级后 NestJS 单元测试
request 未定义问题 可能原因及对应修复方式
1. Mock 函数上下文绑定变化
Jest 29.5.x 对 jest.fn() 的上下文处理有细微调整,若测试中手动 mock request 对象(如守卫、拦截器或控制器测试场景),可能出现绑定丢失。
- 修复:确保 mock 的
request被正确注入测试上下文。例如使用Test.createTestingModule时显式提供 mock 对象:
const moduleRef = await Test.createTestingModule({ controllers: [YourController], providers: [YourService], }) .overrideProvider(REQUEST) .useValue({ user: { id: 1 }, /* 补充测试所需的其他属性 */ }) .compile();
2. NestJS 测试模块与 Jest 版本不兼容
@nestjs/testing 或 @nestjs/core 未适配 Jest 29.5.x 的内部 API 变化,导致请求对象未正确初始化。
- 修复:升级 NestJS 核心及测试模块到最新稳定版:
npm install @nestjs/core@latest @nestjs/testing@latest # 或使用 yarn yarn add @nestjs/core@latest @nestjs/testing@latest
3. 自定义测试工具类的 Mock 失效
若项目有封装的测试工具类(如统一创建 mock 请求的函数),Jest 29.5.x 对 mock 函数返回值的处理逻辑有变更。
- 修复:检查工具类中
jest.spyOn或jest.mock的使用,确保返回的 mock 对象包含所有测试代码依赖的request属性:
// 调整后的 mock 请求生成函数 export const mockRequest = () => ({ headers: {}, body: {}, params: {}, // 补充被测试代码用到的其他 request 属性 });
4. Jest 配置的重置逻辑变更
Jest 29.5.x 调整了 resetMocks 或 restoreMocks 的执行时机,可能导致 mock 请求被提前重置。
- 修复:检查
jest.config.js中的相关配置,可将resetMocks改为false,或在每个测试用例中手动重新初始化 mock 对象:
// jest.config.js module.exports = { // 其他配置 resetMocks: false, restoreMocks: true, };
调试建议
- 在报错的测试用例中添加
console.log(request),确认request对象是否真的未定义,定位丢失环节。 - 对比 Jest 29.4.x 和 29.5.x 的 changelog,重点关注
jest-mock模块的变更细节。
内容的提问来源于stack exchange,提问作者Crawk
相关产品推荐
相关产品推荐

