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
相关产品推荐
相关产品推荐

