【问题标题】:Testing Angular 2 service that returns a Promise测试返回 Promise 的 Angular 2 服务
【发布时间】:2016-11-30 10:44:37
【问题描述】:

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

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

问题是我不能使用 Jasmine 的 done 回调来处理异步 service.getCars() 调用,因为注入函数的工作方式。我也不能使用 async 测试助手,因为它不能与 Promise 一起使用。所以我不知道如何等待 promise 解决——测试只是运行而没有达到 expect

【问题讨论】:

    标签: angular testing asynchronous


    【解决方案1】:

    使用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);
      });
    })));
    

    另外一个选择是根本不使用inject。您可以从TestBed 获得服务。清晰了很多

    let service: DataService;
    
    beforeEach(() => {
      const injector = TestBed.configureTestingModule({});
      service = injector.get(DataService);
    });
    

    不需要inject,而且它也不那么冗长。您现在可以使用done。或者,如果您愿意,仍然使用 Angular 方式,并使用 async

    另请参阅:

    【讨论】:

    • 从 TestBed 获取服务的方式很有效,谢谢。但是,当我尝试异步解决方案时,Karma 测试运行器会打印出错误:“无法在异步区域测试中使用 setInterval”
    • 是的,要么你明确地使用了 setInterval,要么像 Observable.delay 这样的东西正在使用它。不能在async 中使用。不过,您也许可以将它与fakeAsync 一起使用。请参阅“另请参阅”中的链接。它展示了如何使用fakeAsync
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-17
    • 1970-01-01
    • 2017-11-23
    • 1970-01-01
    • 2017-03-22
    • 2018-04-11
    • 2017-06-03
    相关资源
    最近更新 更多