Angular 5 Jasmine错误:期望找到一个匹配的标准请求

mrk*_*nic 6 jasmine angular angular-httpclient

我有一个非常简单的服务电话和茉莉花测试.

服务电话:

myServiceCall(testId: number) : void {
    const url = `${this.url}/paramX/${testId}`;
    this.http.put(url, {},{headers: this.headers}).subscribe();
}
Run Code Online (Sandbox Code Playgroud)

我的测试方法:

it('should call myServiceCall', inject([MyService], (service: MyService) => {
    let testId = undefined;
    service.myServiceCall(testId);
    let req = httpMock.expectOne(environment.baseUrl + "/paramX/123");

    expect(req.request.url).toBe(environment.baseUrl + "/paramX/123");
    expect(req.request.body).toEqual({});

    req.flush({});
    httpMock.verify();
}));
Run Code Online (Sandbox Code Playgroud)

我当然是一个例外,因为我希望url参数为"123"而不是像这个测试用例场景中那样未定义.

错误:预期一个匹配的条件请求"匹配URL: http:// localhost:8080/myservice/paramX/123 ",找不到.

我不明白的是测试框架说的原因

找不到

虽然提出了要求.是否有可能让测试框架告诉我其他实际调用是什么,类似于mockito的验证?

小智 13

我的问题解决了.在我添加到url之后,params(如果你使用params).

let results = { param: 'results', value: '50' }; url = `${api.url}${route.url}?${results.param}=${results.value}`;

HttpTestingController始终只显示没有参数的url,但如果使用expectOne(url)它,则使用带有查询字符串的url: http://example.com/path/to/page?name=ferret&color=purple

  • 这也是我在 Angular 6 中的问题。HttpTestingController 报告了 DELETE 请求的 URL *没有参数*,但正在使用参数发出请求。只要我匹配 URL 中的参数,测试就通过了。 (2认同)

小智 10

您读错了错误,让我为您改错:

错误:预期有一个匹配的请求,但没有找到。

这仅表示您的网址不匹配。

您可以做的是使用以下命令添加URL的控制台日志

console.log(req.request.url);
Run Code Online (Sandbox Code Playgroud)

或者,您可以简单地尝试匹配请求。

其他解决方案:由于您依赖环境变量,因此可以运行此测试:

expect(req.request.url.endsWith("/paramX/123")).toEqual(true);
Run Code Online (Sandbox Code Playgroud)

  • 嗯,事实并非如此。而且,我并没有告诉您将控制台日志投入生产,而是告诉您,以便您了解为什么URL不匹配。您可以随后将其删除。 (3认同)
  • @trichetrice 你能解释一下如何在 request.url 无法获取请求时记录它 - 在这一行出现错误:`let request= httpMock.expectOne(url);` (2认同)
  • @matchifang `expectOne(url: string)` 是签名之一:你有 3 个。其中之一是 `expectOne(matchFn: Function)` :你可以提供一个回调函数,它有一个 `HttpRequest` 对象作为参数:通过记录该对象,可以获得被调用的URL。 (2认同)
  • `expectOne(req => console.log(req));` (2认同)