在一个有角度的2应用程序中,我有一个将http observable转换为promises的数据服务,以便使用async / await sweetness,如下所示:
async getCustomer(id: number): Promise<Customer> {
return await this._http.get<Customer>(`${this.serverUrl}/customer/${id}`).toPromise();
}
这是可操作的,外观和效果都很好。
我以前的单元测试使用MockBackend
类似
mockBackend.connections.subscribe(c => {
expect(c.request.url).toBe(`${serverUrl}/customer/${id}`);
let response = new ResponseOptions({ body: mockResponseBody });
expect(c.request.method).toBe(RequestMethod.Get);
c.mockRespond(new Response(response));
});
let actual = await service.getCustomer(id);
然而,现在当我尝试使用
这样的东西时httpMock = TestBed.get(HttpTestingController);
// ... 1
let actual = await service.getCustomer(id);
// ... 2
我正陷入鸡与蛋的境地。在提供模拟请求之前,getCustomer
方法不会返回,在触发http调用之前,我无法使用httpMock.expectOne
或httpMock.match
。
所以,如果我在[1]中进行httpMock
调用,我的预期会失败,如果我把它放在[2]中,我会收到超时错误:(
有解决方法吗?
答案 0 :(得分:3)
我不知道TestBed
究竟是如何运作的。我不明白为什么它会阻止您在getCustomer
调用之前安装模拟。你应该使用一个允许你这样做的框架。
但是可以使用当前的设置:只需推迟等待承诺!
httpMock = TestBed.get(HttpTestingController);
let customerPromise = service.getCustomer(id);
httpMock.mockRespond({}); // Or whatever
let actual = await customerPromise;