【发布时间】:2017-08-03 15:12:14
【问题描述】:
我在测试http 请求时很难调用catch 方法,但我不知道自己做错了什么。我已经将我的测试与此处找到的 lthers 进行了比较,但我无法找到我所缺少的。
这就是我要测试的方法:
public get(apiName, methodName) {
return this.http.get(this.url + apiName + "/" + methodName, {
headers: headers,
search: params
}).catch((error) => {
this.backendErrorService.notify(this.handleError(error));
return Observable.throw(error);
});
}
如果我运行测试,上面的方法会被调用,我什至可以检查this.http.get是否被调用,但我不能让catch被调用。
这是我的测试:
it("should show modal when contract service throws", fakeAsync(() => {
// Arrange
let http = TestBed.get(Http);
let backendService = TestBed.get(BackendErrorService);
let backend = TestBed.get(MockBackend);
backend.connections.subscribe((connection: MockConnection) => {
connection.mockError(new MockError(new ResponseOptions({ type: ResponseType.Error, status: 404, body: {} })));
});
let httpClientService: HttpClientService = new HttpClientService(http, backendService);
httpClientService.get("ContractApi", "GetContracts");
// Act
fixture.detectChanges();
tick();
// Assert
console.log(fixture.debugElement);
}));
我错过了什么?
【问题讨论】:
-
如果不进一步了解您要实现的目标,我不确定,但我发现提供 jasmine 间谍对象或
spyOn(service.http, 'get')而不是真正的 http 服务要简单得多。这将允许您执行mockHttp.get.and.returnValue(Observable.throw(error))之类的操作。 -
很高兴您找到了问题的答案,请将其发布为答案而不是编辑see this for why :)