对于我的单元测试,我确保我的组件正在调用正确的方法,然后如果行为正确,则应具有适当的行为。我在这些测试中遇到的唯一麻烦是涉及到错误。我试图使我的服务失败,以便在警报窗口中显示异常消息。我正在寻找有关如何使我的服务失败而不导致实际测试失败的见解。可以说我有一个与此相似的函数:
exceptionMessage: string = 'error, please contact administrator'
getInfo() {
this.myService.getData('url')
.catch((error: Response | any) => {
this.displayAlert(this.exceptionMessage);
console.error(error.message || error);
return Observable.throw(error.message || error);
});
};
测试:
fit('should call displayAlert', () => {
let window = spyOn(userComponent, 'displayAlert');
spyOn(myService, 'getData').and.returnValue(Observable.of('url')//need to fail here
userComponent.ngOnInit();
userComponent.getInfo();
expect(window).toHaveBeenCalled();
});
运行测试时,我的代码期望间谍窗口已被调用。但是,由于我的服务没有失败,因此无法访问代码中的displayAlert函数。现在,我已经能够成功测试我的服务可以正确处理错误,但是它们捕获了可观察到的错误,并且没有像我的component方法一样显示警报窗口。我已经尝试过像服务一样实施测试,但是没有运气。我的目标是进行单元测试,从而导致我的服务失败。从那里我需要测试当我的组件遇到错误时,显示一条错误消息。我需要服务失败,这样我才能到达代码this.displayAlert
,谢谢!如果有人可以指导我提供适当的文档或提供见解,那将是很好的。我找不到很多东西。
编辑:更新测试:
fit('should have getUsers() call showAlertWindow', () => {
let window = spyOn(userComponent, 'showAlertWindow');
spyOn(userComponent, 'loadUser').and.throwError('Error');
expect(() => {
userComponent.loadUser()}).toThrowError('Error');
userComponent.loadUser();
expect(window).toHaveBeenCalled();
});
答案 0 :(得分:2)
您需要做的是引发异常,而不是调用.and.returnValue
。
类似这样的东西
spyOn(myService, 'getData').and.throwError(“My Error”)
这将使spy
每次被调用时都引发异常,从而允许它陷入catch语句中,然后您可以在其中测试是否调用了内部代码。
您可以查看Jasmine
文档here
答案 1 :(得分:1)
我只是添加到@HugoNoro答案
侦查类似
的方法之后let window = spyOn(userComponent, 'displayAlert');
spyOn(myService, 'getData').and.throwError(error.message)
....
您还可以添加一个测试,以预期getInfo()
和displayAlert
测试一起引发的错误
.......
expect(()=> { userComponent.getInfo(); }).toThrow(error.message); // error should be thrown from the component's catch block
expect(window).toHaveBeenCalled();