我試圖模擬組件測試的服務。 這裏我的服務:在單元測試中嘲笑服務
@Injectable()
export class LoginService {
constructor(public http: Http) { }
getLanguages() {
return this.http.get('the-url')
.map((res: Response) => res.json());
}
...
注:我的組件調用構造函數中的這個方法(構造比較時加載的語言)。
然後我試圖嘲笑它:
class MockLoginService {
getLanguages() {
return Observable.of(
[
{
'name': 'English (USA)',
'locale': 'en-US'
},
{
'name': 'Español',
'locale': 'es-US'
}
]
);
}
而且我的組件單元測試:
it('should load languages', inject([TestComponentBuilder], (tcb: TestComponentBuilder) => {
tcb
.overrideProviders(LoginComponent, [ provide(LoginService, { useClass: MockLoginService })])
.createAsync(LoginComponent).then((fixture) => {
let element = fixture.nativeElement;
let loginInstance = fixture.componentInstance;
fixture.detectChanges();
expect(loginInstance._loginService.getLanguages).toHaveBeenCalled();
expect(element.querySelectorAll('option').length).toBe(5);
});
}));
問題:
我看到我的模擬服務被稱爲和接收的數據是正確的,但我的2個測試被跳過!這裏是日誌:
angular2-polyfills.js:528 Unhandled Promise rejection: 'expect' was used when there was no current spec, this could be because an asynchronous test timed out ; Zone: ; Task: Promise.then ; Value: Error: 'expect' was used when there was no current spec, this could be because an asynchronous test timed out(…)
我承諾服務執行異步和測試丟失某處。 (......)
我嘗試了fakeAsync與(),但沒有捕獲(承諾)錯誤:'期望'被用於沒有當前規範,這可能是因爲異步測試超時剔 - 沒有成功。 在此先感謝!
試試'injectAsync([TestComponentBuilder],''而不是'inject([TestComponentBuilder],..' –