测试返回 Promise 的 Angular 2 服务

Dal*_*vic 5 testing asynchronous angular

我正在尝试对一个服务进行单元测试,该服务应该使用由 Angular 的内存数据服务提供的假 http 后端。这是相关代码:

describe('getCars() method ', ()  => {
      it('should return a resolved Promise', inject([DataService], (service: DataService) => {
        service.getCars().then((value) => {
          expect(value.length).toBe(3);
       });
    }));
  });
Run Code Online (Sandbox Code Playgroud)

问题是我无法使用 Jasmine 的完成回调来处理异步service.getCars()调用,因为注入函数的工作原理。我也不能使用异步测试助手,因为它不能与承诺一起使用。所以我不知道如何等待承诺解决——测试只是运行而没有达到预期

Pau*_*tha 5

使用async,这会将其包装为一个区域,等待所有异步任务完成后再测试完成。

import { async } from '@angular/core/testing';

                                   // !!!!!!!
it('should return a resolved Promise', async(inject([DataService], (service: DataService)=>{
  service.getCars().then((value) => {
    expect(value.length).toBe(3);
  });
})));
Run Code Online (Sandbox Code Playgroud)

inject另一种选择是根本不使用。您只需从 获得服务即可TestBed。就清楚多了

let service: DataService;

beforeEach(() => {
  const injector = TestBed.configureTestingModule({});
  service = injector.get(DataService);
});
Run Code Online (Sandbox Code Playgroud)

不需要inject,而且它要简洁得多。您现在可以使用done. 或者,如果您愿意,仍然可以采用 Angular 方式,并使用async.

也可以看看: