我有一个非常简单的服务电话和茉莉花测试。
服务电话:
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的验证?
答案 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,因此您的规格无法告知何时完成。这意味着您必须使用waitForAsync
或fakeAsync
来操纵时间。