捕获 HTTP 请求未被 Jasmine 调用



我正在努力在测试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);
}));

我错过了什么?

解决方案是添加订阅。

由于它是可观察的,如果没有订阅者,则不会进行调用,这是完整的解决方案:

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 = new HttpClientService(http, backendService);
httpClientService.get("ContractApi", "GetContracts").map((res: Response) => {}).subscribe((contracts) => {
});
// Act
fixture.detectChanges();
tick();
// Assert
console.log(fixture.debugElement);
}));

最新更新