2016-04-22 155 views
4

我試圖模擬組件測試的服務。 這裏我的服務:在單元測試中嘲笑服務

@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與(),但沒有捕獲(承諾)錯誤:'期望'被用於沒有當前規範,這可能是因爲異步測試超時剔 - 沒有成功。 在此先感謝!

+0

試試'injectAsync([TestComponentBuilder],''而不是'inject([TestComponentBuilder],..' –

回答

2

你可以嘗試手動實例化你的嘲笑服務和beforeEachProviders方法回調

var service = new MockLoginService(); 

beforeEachProviders(() => [ provide(TestService, { useValue: service })]); 

it('should load languages', inject([TestComponentBuilder], (tcb: TestComponentBuilder) => { 
    tcb 
     .createAsync(LoginComponent).then((fixture) => { 
      let element = fixture.nativeElement; 
      let loginInstance = fixture.componentInstance; 
      fixture.detectChanges(); 

      expect(element.querySelectorAll('option').length).toBe(2); 
     }); 
})); 

它爲我的作品中進行設置。看到這個plunkr:https://plnkr.co/edit/zTy3Ou?p=preview

+0

明白了!我沒有返回任何東西,這就是爲什麼我的代碼錯過了行爲。謝謝! –

+0

我' m,然後我得到了一堆像這樣的錯誤:''MockUserService'類型的參數不能分配給'UserService'類型的參數,我該如何解決這個問題? – FrontierPsycho