如何解决如果 HTTPClientTestingModule 没有发出真正的 API 请求或增加代码覆盖率,为什么我们要使用 HTTPClientTestingModule 测试 HTTP 请求?
Angular 文档中有一节解释了如何测试 HTTP 请求;使用 HttpClientTestingModule
和 HttpTestingController
:https://angular.io/guide/http#testing-http-requests
在该部分,他们向您展示了如何编写一个测试,向此处的“模拟后端”发出 HTTP 请求:https://angular.io/guide/http#expecting-and-answering-requests
这是他们示例中使用的代码:
it('can test HttpClient.get',() => {
const testData: Data = {name: 'Test Data'};
// Make an HTTP GET request
httpClient.get<Data>(testUrl)
.subscribe(data =>
// When observable resolves,result should match test data
expect(data).toEqual(testData)
);
// The following `expectOne()` will match the request's URL.
// If no requests or multiple requests matched that URL
// `expectOne()` would throw.
const req = httpTestingController.expectOne('/data');
// Assert that the request is a GET.
expect(req.request.method).toEqual('GET');
// Respond with mock data,causing Observable to resolve.
// Subscribe callback asserts that correct data was returned.
req.flush(testData);
// Finally,assert that there are no outstanding requests.
httpTestingController.verify();
});
所以我的问题是,这种测试的意义何在? AFAIK,它不会增加代码覆盖率,因为它不会针对服务运行,也不会调用真正的后端。
解决方法
是的,他们的榜样希望一切顺利。
我们需要 HttpClientTestingModule
时需要:
- 测试对响应执行的复杂管道
- 测试拦截器
第一点可以用一个假的 Subject
对象来完成,而第二点只能用 HttpClientTestingModule
来测试。
您可以在 ng-mocks 的文档中找到更多真实示例: