Jasmine:如何测试组件内的异常消息?

Kid*_*001 2 unit-testing jasmine karma-jasmine angular

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

 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);
              });
    };
Run Code Online (Sandbox Code Playgroud)

测试:

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

   });
Run Code Online (Sandbox Code Playgroud)

运行测试时,我的代码期望调用间谍窗口。但由于我的服务没有失败,我无法访问代码中的 displayAlert 函数。现在,我能够成功测试我的服务是否正确处理错误,但它们捕获可观察到的内容,并且不会像我的组件方法那样显示警报窗口。我尝试像我的服务一样实施测试,但没有成功。我的目标是进行单元测试,这会导致我的服务失败。从那里我需要测试当我的组件遇到错误时,会显示错误消息。我需要服务失败才能获取代码,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();
  });
Run Code Online (Sandbox Code Playgroud)

Hug*_*oro 5

你需要做什么,而不是打电话.and.returnValue,而是抛出异常。

\n\n

像这样的东西

\n\n
spyOn(myService, \'getData\').and.throwError(\xe2\x80\x9cMy Error\xe2\x80\x9d)\n
Run Code Online (Sandbox Code Playgroud)\n\n

这将使spy每当调用时抛出异常,从而允许落入 catch 语句中,然后您可以在其中测试内部代码是否正在被调用。

\n\n

您可以在此处Jasmine查看文档

\n

  • 我相信该函数没有正确捕获错误,因为运行测试会导致我收到该错误。当我运行 userComponent.getinfo 行时,它会导致测试失败。我试图让组件捕获错误,以便我可以到达alertwindow 函数。 (2认同)