我正在尝试对从另一个服务获取值的服务进行单元测试(返回Promise),然后执行http GET请求。
我正在使用来自@ angular / common / http / testing的HttpTestingController来模拟http请求。这是测试和产品代码:
tested.service.spec.ts
it('should get base url from indexedDb then execute http get request', (async () => {
fakeParametresService.getBaseUrl.and.returnValue(Promise.resolve({valeur: 'http://host:port'}));
testedService.get<any>('/endpoint').then((response: any) => {
expect(response.key).toBe('value');
});
await http.expectOne('http://host:port/endpoint').flush({key: 'value'});
http.verify();
}));
tested.service.ts
async get<T>(endpoint: string): Promise<T> {
const baseUrl = await this.parametresService.getBaseUrl();
return this.http.get<T>(`${baseUrl.valeur}${endpoint}`).toPromise();
}
似乎嵌套在promise中的http请求不能以这种方式进行模拟。但也许这是我的误解。
答案 0 :(得分:2)
对我而言,使用fakeAsync
测试区是有效的。在那里你有tick()
函数等待所有承诺都解决后继续你的测试。问题是您无法在fakeAsync
区域内发出任何XHR请求,但HttpClientTestingModule
对我来说效果很好。
it('should get base url from indexedDb then execute http get request', fakeAsync(() => {
fakeParametresService.getBaseUrl.and.returnValue(Promise.resolve({valeur: 'http://host:port'}));
testedService.get<any>('/endpoint').then((response: any) => {
expect(response.key).toBe('value');
});
// wait until all Promises are resolved
tick();
http.expectOne('http://host:port/endpoint').flush({key: 'value'});
http.verify();
}));