如何测试NestJS响应拦截器?参考现有方案测试仍报错如何解决?
问题原因
- 拦截器
intercept方法返回的是RxJSObservable类型,不能直接用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
相关产品推荐
相关产品推荐

