2016-05-09 138 views
0

我的單元測試與Jasmine有幾個問題。第一招:Angular 2單元測試

我需要在一個叫CaseList組件來測試這一點:

gotoDetail(case: Case){ 
    this._router.navigate(['CaseDetail', {"id": case.id}]); 
} 

我所有的努力在測試給誤差this._router是不確定的,那麼這是因爲我還沒有將它定義在我的測試中,因爲我無法弄清楚如何!我甚至沒有在測試中提出任何好的嘗試,因爲我不知道如何進行。所以這就是爲什麼我沒有在這裏發佈任何嘗試...

編輯:路由器測試中與上述問題有關的部分,但我測試了單獨文件中的所有路由!這個測試有效!

it('Should navigate to Case Detail List', (done) => { 
router.navigate(['CaseDetail', {id: 'test'}]).then(() => { 
     expect(location.path()).toEqual('/casedetail/test'); 
     done(); 
    }).catch(e => done.fail(e)); 
}); 

從細節成分(其中,用戶選擇的情況下後導航)第二測試:

addStep(){ 
    this.case.getSteps().push(new Step()); 
} 

我也有一個remove方法我需要測試:

removeStep(step: Step){ 
    this.case.removeStep(step); 
} 

構造此組件:

constructor(public _routeParams: RouteParams, public _service: Service) { 
    this.case = _service.getById(_routeParams.get('id')); 
} 

所以測試我想這樣做的附加方法:

it('passes new step to case-class',() => { 
    spyOn(case, 'addStep') 
    .and.returnValue(Observable.of({complete: true})) 
    caseDetail.addStep(); 
    expect(case.addStep).toHaveBeenCalledWith(step); 
}); 

所以這些方法調用是所謂的「案例」一個單獨的類的方法。

我在測試這些時遇到的錯誤是這種情況是空的。我猜路由和服務會混淆它,因爲在同一個組件中我有其他「相同」的方法,並且測試那些工作正常。但他們屬於不同的階級。

方法相同的組件,指的是「步」級:

addFeedback(step: Step){ 
    step.addFeedback(new Feedback()); 
} 

測試完美的作品:在測試中我應該擁有的一切組件

it('passes feedback value to Step class',() => { 
    spyOn(step, 'addFeedback') 
    .and.returnValue(Observable.of({complete: true})) 
    caseDetail.addFeedback(step); 
    expect(step.addFeedback).toHaveBeenCalledWith(feedback); 
}) 

所以,很顯然定義是因爲反饋方法的測試起作用。我只需要以某種方式定義「case」對象,以便它不會抱怨它爲空。

希望你能得到我的問題,希望你能幫上忙! :)

回答

1

爲了讓您的測試案例起作用,您必須在測試之前添加路由器和案例作爲提供者。

路由示例:

import {RootRouter} from 'angular2/src/router/router'; 
import {Location, RouteParams, Router, RouteRegistry, ROUTER_PRIMARY_COMPONENT} from 'angular2/router'; 
import {SpyLocation} from 'angular2/src/mock/location_mock'; 
import {provide} from 'angular2/core'; 

describe('Router',() => { 
    let location, router; 

    beforeEachProviders(() => [ 
    RouteRegistry, 
    provide(Location, {useClass: SpyLocation}), 
    provide(Router, {useClass: RootRouter}), 
    provide(ROUTER_PRIMARY_COMPONENT, {useValue: App}), 
    ]); 

    beforeEach(inject([Router, Location], (_router, _location) => { 
    router = _router; 
    location = _location; 
    })); 

    it('Should be able to navigate to Home', done => { 
    router.navigate(['Index']).then(() => { 
     expect(location.path()).toBe(''); 
     done(); 
    }).catch(e => done.fail(e)); 
    }); 
}); 

案例提供:

import {Case} from '../case'; 

    beforeEachProviders(() => [ 
    provide(case, Case) 
    ]); 
+0

我確實有路由器單獨的測試,實際上與你的榜樣。這工作正常。我不確定你的意思是「在測試之前添加路由器和案例作爲提供者」。我對編碼真的很陌生,這是我第一次嘗試單元測試;)在我的原始問題中添加了與我的第一個「問題」 - 「gotodetail」相關的路由測試。如所說的路線測試工作正常!但是我需要測試組件中的「gotodetail」,並且我不確定如何在那裏定義路由器?我真的需要在那裏添加所有的代碼,以便能夠測試「gotodetail」嗎? – Alex

+0

還是我需要測試「goToDetail」,因爲路線經過測試?我猜想我有點困惑。第二個問題仍然存在,情況是空的,所以如果有人有任何見解,這將不勝感激:) – Alex

+0

如果你在單元測試中通過路線導航,那麼你會需要所有的代碼。對於情況爲空,我不太確定是什麼情況,但是您可以在單元測試之前嘗試添加案例作爲提供者 – xphong