当实际请求嵌套在promise中时,HttpTestingController expectOne不起作用

时间:2017-11-02 08:59:56

标签: angular jasmine

我正在尝试对从另一个服务获取值的服务进行单元测试(返回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请求不能以这种方式进行模拟。但也许这是我的误解。

1 个答案:

答案 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();    
}));