如何调试“针对条件“匹配网址”的一个预期匹配请求:找不到”

时间:2019-10-29 09:44:06

标签: angular typescript jasmine angular-httpclient angular-test

在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&param2=b');

  expect(req.request.method).toEqual('GET');

  req.flush(mockResultData);

  httpTestingController.verify();
});

但是测试失败并显示以下内容:

  

错误:预期对标准“匹配URL:   / some / path?param1 = a&param2 = b“,却找不到。

现在我很清楚触发的请求并没有确切的URL /some/path?param1=a&param2=b,但是错误消息没有提及找到了哪些请求

我该如何调试并检查实际找到了哪些请求?

1 个答案:

答案 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&param2=b');

  // expect(req.request.method).toEqual('GET');

  // req.flush(mockResultData);

  httpTestingController.verify();
});

这样,方法httpTestingController.verify()将检查是否有未处理的请求,否则将触发错误。因此,因为确实有一个待处理的请求,它现在将出现错误:

  

错误:预期没有打开的请求,发现1:GET / some / path?param2 = b&param1 = a

这正是我所需要的:知道实际的请求是什么。

因此,在我的情况下,问题出在交换的参数(param2=bparam1=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&param1=a'); // now the params are in the right order

  expect(req.request.method).toEqual('GET');

  req.flush(mockResultData);

  httpTestingController.verify();
});