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

时间:2018-06-08 07:53:58

标签: angular jasmine angular-httpclient

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

服务电话:

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

我的测试方法:

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();
}));

我当然是一个异常,因为我希望url参数为“123”而不是像在这个测试用例场景中那样未定义。

  

错误:预期一个符合标准的匹配请求“匹配网址:   http://localhost:8080/myservice/paramX/123“,找不到。

我不明白为什么测试框架说

  

找不到

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

4 个答案:

答案 0 :(得分:12)

我的问题解决了。在我添加到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

答案 1 :(得分:5)

您已经错误地阅读了错误,请让我为您重新修改错误:

  

错误:预计有一个匹配的请求[...],找不到。

这只是意味着您的网址不匹配。

您可以使用

添加网址的控制台日志
console.log(req.request.url);

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

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

expect(req.request.url.endsWith("/paramX/123")).toEqual(true);

答案 2 :(得分:0)

您应该将测试包含在fakeAsync中,并在测试结束时调用tick()。 像

it('should call myServiceCall', inject([MyService], fakeAsync((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();
    tick();

})));

答案 3 :(得分:0)

您已经在呼叫httpMock.verify(),如果有意外请求,该请求将失败,并将有关这些请求的某些信息记录到控制台。如果您的expectOne失败并没有“发现”,并且verify没有失败,则您的服务实际上不一定已调用http.put()。添加一些日志记录或在调试器中逐步进行测试以查看实际情况。

正如其他答案所指出的,这可能是由于时间问题。您的服务呼叫不会返回Observable或Promise,因此您的规格无法告知何时完成。这意味着您必须使用waitForAsyncfakeAsync来操纵时间。