如何使用HttpTestingController测试promises?

时间:2017-09-28 09:45:27

标签: angular unit-testing

在一个有角度的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.expectOnehttpMock.match
所以,如果我在[1]中进行httpMock调用,我的预期会失败,如果我把它放在[2]中,我会收到超时错误:(

有解决方法吗?

1 个答案:

答案 0 :(得分:3)

我不知道TestBed究竟是如何运作的。我不明白为什么它会阻止您在getCustomer调用之前安装模拟。你应该使用一个允许你这样做的框架。

但是可以使用当前的设置:只需推迟等待承诺!

httpMock = TestBed.get(HttpTestingController);
let customerPromise = service.getCustomer(id);
httpMock.mockRespond({}); // Or whatever 
let actual = await customerPromise;