2016-11-30 106 views
3

我想单元测试应该使用由Angular的内存数据服务提供的假http后端的服务。这是相关代码:测试返回Promise的Angular 2服务

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

问题是我不能用茉莉花回调对待,因为函数是如何工作注入异步service.getCars()调用,。我不能使用async测试助手,因为它不能与promise一起使用。所以我不知道如何等待承诺解决---测试运行没有达到期望

回答

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。或者如果你愿意,仍然以角度的方式去做,并使用async

参见:

+0

与得到的服务从测试床的作品,感谢的方式。然而,当我尝试异步解决方案时,Karma test runner会打印出一个错误:“不能在异步区域测试中使用setInterval” –

+1

是的,无论是明确使用setInterval还是类似Observable.delay的东西都在使用它。它不能在'async'中使用。不过,你也许可以用'fakeAsync'来使用它。请参阅“另请参阅”中的链接。它显示了如何使用'fakeAsync' –