茉莉花:如何测试组件内的异常消息?

时间:2018-07-05 21:10:52

标签: angular unit-testing jasmine karma-jasmine

对于我的单元测试,我确保我的组件正在调用正确的方法,然后如果行为正确,则应具有适当的行为。我在这些测试中遇到的唯一麻烦是涉及到错误。我试图使我的服务失败,以便在警报窗口中显示异常消息。我正在寻找有关如何使我的服务失败而不导致实际测试失败的见解。可以说我有一个与此相似的函数:

 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();
  });

2 个答案:

答案 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();