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

升级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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 07:02:42