2017-03-05 44 views
0

我正在測試服務(myService)在Angular 2中依賴於Router。由於我使用了Angular的一個組件,因此我將使用Angular的TestBed類。所以,我建立了我的beforeEach如下:Angular2 TestBed Inject

let router: Router; 
beforeEach(async(() => { 
     TestBed.configureTestingModule({ 
      providers: [ 
       {provide: Router, useClass: RouterStub} 
      ] 
     }); 
     router = TestBed.get(Router); 
     myService = new MyService(router); 
    })); 

@Injectable() 
export class RouterStub { 
    navigate() {}; 
} 

現在,我寫我的測試失敗,其中RouterStub定義(紅,綠,重構......)

it('on myServiceMethod calls router',() => {  
    let spy = spyOn(router, 'navigate'); 

    // myService.myServiceMethod(); // commented out so test fails 

    expect(spy).toHaveBeenCalledTimes(1); 
}) 

並且測試按預期失敗。不過,我現在嘗試使用TestBedInject函數寫相同的測試,即

it('on myServiceMethod calls router',() => { 
    inject([Router], (router: Router) => { 
     let spy = spyOn(router, 'navigate'); 

     // myService.myServiceMethod(); // commented out so test fails 

     expect(spy).toHaveBeenCalledTimes(1); 
    }) 
}) 

這個測試通過了,即使我認爲Inject功能將從TestBed檢索Router相同的實例。我不瞭解什麼?

+0

你有沒有試着用'RouterModule.forRoot()'在'TestBed'?路由器服務不會,如果你注入不要調用'forRoot()'。但這只是一個長時間的拍攝。 –

+0

@camaron好想法,但不幸的是沒有解決它。似乎很奇怪,只能假設我錯過了一些東西。 –

回答

0

伴侶也應該使用getTestBed@angular/core/testing並注入像,

getTestBed().get(YourService) 
+0

但是,這不是我在第一次測試中所做的事情嗎?是的,這是有效的,而且是我目前使用的,但問題更多的是瞭解'inject'函數。 –