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

如何测试NestJS响应拦截器?参考现有方案测试仍报错如何解决?

问题原因
  • 拦截器intercept方法返回的是RxJS Observable类型,不能直接用await取值,需要先转换为Promise
  • 模拟的callHandler.handle返回值类型错误,拦截器预期它返回Observable,你当前返回的是Promise
  • 原有断言逻辑和拦截器实际功能不匹配:你的拦截器仅处理响应数据包装,没有修改请求body的逻辑,不需要校验请求body属性,核心校验点应为响应是否被包装为预期格式
正确测试实现

首先需要从rxjs引入of和lastValueFrom工具,以下是完整的测试文件代码:

import { TransformResponseInterceptor } from './transform-response.interceptor';
import { of, lastValueFrom } from 'rxjs';

const interceptor = new TransformResponseInterceptor();

// 你的拦截器没有用到ExecutionContext的内容,所以模拟对象可以简化
const executionContext: any = {};

const callHandler = {
  handle: jest.fn(),
};

describe('TransformResponseInterceptor', () => {
  it('should be defined', () => {
    expect(interceptor).toBeDefined();
  });

  describe('#intercept', () => {
    it('should wrap controller return value into expected response structure', async () => {
      // 模拟控制器返回的原始数据
      const mockControllerRes = { name: 'test data', id: 1001 };
      // 让handle返回Observable类型的模拟数据
      callHandler.handle.mockReturnValueOnce(of(mockControllerRes));
      
      // 转换Observable为Promise获取拦截后的值
      const res = await lastValueFrom(interceptor.intercept(executionContext, callHandler));
      
      // 校验结构符合预期
      expect(res).toEqual({
        success: true,
        data: mockControllerRes
      });
      // 校验控制器方法确实被调用
      expect(callHandler.handle).toBeCalledTimes(1);
    });
  });
});
逻辑说明
  • 用of()方法将模拟的控制器返回值包装为Observable,匹配拦截器的入参类型要求
  • 用lastValueFrom()读取Observable流的最终输出值,支持await异步获取结果
  • 断言直接校验拦截后的返回结构是否符合你定义的ApiResponseInterface要求,满足你的测试目标

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 15:27:05