2016-05-09 140 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