在Angular应用中,我正在测试使用HttpClient
的服务,就像官方文档中所建议的那样:
https://angular.io/guide/http#testing-http-requests
这是我的测试用例的样子:
it('myMethod() should correctly sent the http request', () => {
const mockResultData = { result: 123 };
service.myMethod(); // will trigger an http request using the httpClient
const req = httpTestingController.expectOne('/some/path?param1=a¶m2=b');
expect(req.request.method).toEqual('GET');
req.flush(mockResultData);
httpTestingController.verify();
});
但是测试失败并显示以下内容:
错误:预期对标准“匹配URL: / some / path?param1 = a&param2 = b“,却找不到。
现在我很清楚触发的请求并没有确切的URL /some/path?param1=a¶m2=b
,但是错误消息没有提及找到了哪些请求。
我该如何调试并检查实际找到了哪些请求?
答案 0 :(得分:0)
诀窍是在不使用expectOne
的情况下运行相同的测试,因此只需使用service.myMethod()
触发http请求,然后调用httpTestingController.verify()
:
it('myMethod() should correctly sent the http request', () => {
const mockResultData = { result: 123 };
service.myMethod(); // will trigger an http request using the httpClient
// TEMPORARILY COMMENT THESE 3 LINES
// const req = httpTestingController.expectOne('/some/path?param1=a¶m2=b');
// expect(req.request.method).toEqual('GET');
// req.flush(mockResultData);
httpTestingController.verify();
});
这样,方法httpTestingController.verify()
将检查是否有未处理的请求,否则将触发错误。因此,因为确实有一个待处理的请求,它现在将出现错误:
错误:预期没有打开的请求,发现1:GET / some / path?param2 = b&param1 = a
这正是我所需要的:知道实际的请求是什么。
因此,在我的情况下,问题出在交换的参数(param2=b
和param1=a
)上。所以我终于可以修复我的测试用例:
it('myMethod() should correctly sent the http request', () => {
const mockResultData = { result: 123 };
service.myMethod(); // will trigger an http request using the httpClient
const req = httpTestingController.expectOne('/some/path?param2=b¶m1=a'); // now the params are in the right order
expect(req.request.method).toEqual('GET');
req.flush(mockResultData);
httpTestingController.verify();
});