我的单元测试与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”对象,以便它不会抱怨它为空。
希望你能得到我的问题,希望你能帮上忙! :)
我确实有路由器单独的测试,实际上与你的榜样。这工作正常。我不确定你的意思是“在测试之前添加路由器和案例作为提供者”。我对编码真的很陌生,这是我第一次尝试单元测试;)在我的原始问题中添加了与我的第一个“问题” - “gotodetail”相关的路由测试。如所说的路线测试工作正常!但是我需要测试组件中的“gotodetail”,并且我不确定如何在那里定义路由器?我真的需要在那里添加所有的代码,以便能够测试“gotodetail”吗? – Alex
还是我需要测试“goToDetail”,因为路线经过测试?我猜想我有点困惑。第二个问题仍然存在,情况是空的,所以如果有人有任何见解,这将不胜感激:) – Alex
如果你在单元测试中通过路线导航,那么你会需要所有的代码。对于情况为空,我不太确定是什么情况,但是您可以在单元测试之前尝试添加案例作为提供者 – xphong