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

Angular2 HTTP拦截器测试报错:存在未关闭请求该如何解决?

解决Angular测试中"Expected no open requests, found 1"错误

这个问题我之前也碰到过,其实是Angular的HttpTestingController在测试结束时的校验机制在起作用——它会检查所有通过HttpClient发起的请求是否都被匹配并处理了,哪怕你已经订阅了请求,只要没模拟返回响应,测试结束时就会抛出这个错误。

你的问题出在哪?

看你的测试代码,你只发起了GET /web-service请求,但没有告诉测试框架如何处理这个请求:

it('check if request path...', inject([HttpClient, HttpTestingController], (http: HttpClient, httpMock: HttpTestingController) => { 
  http.get('/web-service').subscribe( response => { 
    expect(response).toBeTruthy(); 
  }); 
  // 缺少:匹配请求并返回模拟响应的代码
}));

正确的测试写法

你需要添加两步关键操作:

  • 用httpMock.expectOne()匹配发起的请求
  • 用flush()返回模拟响应,让订阅的回调执行
  • 最后可以用httpMock.verify()主动校验所有请求都已处理(可选,但推荐)

修改后的代码如下:

it('check if request path...', inject([HttpClient, HttpTestingController], (http: HttpClient, httpMock: HttpTestingController) => { 
  // 1. 发起请求
  http.get('/web-service').subscribe( response => { 
    expect(response).toBeTruthy(); 
  }); 

  // 2. 匹配对应的请求
  const req = httpMock.expectOne('/web-service');
  // 确认请求方法正确(可选,如果你要校验请求方法的话)
  expect(req.request.method).toBe('GET');

  // 3. 返回模拟响应,触发订阅回调
  req.flush({ key: 'value' }); // 这里可以替换成你期望的响应数据

  // 4. 主动校验所有请求都已处理(确保没有遗漏)
  httpMock.verify();
}));

为什么这样能解决问题?

当你调用req.flush()后,测试框架会模拟后端返回响应,触发你订阅的回调函数执行断言,同时标记这个请求为“已处理”。测试结束时HttpTestingController就不会再检测到未完成的请求,自然就不会抛出那个错误了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:42:27