Angular Jasmine SpyOn $ resource Handle Errors

时间:2016-03-30 00:11:55

标签: javascript angularjs jasmine angular-resource spyon

我正在尝试对使用$resource的AngularJS服务进行单元测试。为了保持孤立,我想使用Jasmine的spyOn并监视$resource的{​​{1}}方法。在我的控制器中,我希望能够使用query()的简短形式,您可以将成功和错误函数直接传递给查询方法,而无需调用query()。这是可能的,还是我坚持使用$promise.then(success, error)的长形式?

以下是我使用失败测试创建的一名说明我的问题:http://plnkr.co/edit/hVc2YNnwUDNv7IHODOMD?p=preview

我已经找到了几个关于SO声称要解决问题的问题,但是所有问题都使用了我正在使用的组件的旧版本。从plunker你可以看到我正在使用Angular 1.5.2和Jasmine 2.4.1。

作为一个相关问题,许多教程显示在您的控制器中,您只需将query().$promise.then(success, error)的返回值分配给一个数组,并且在加载数据时,该数组将被更新。这是最干净的解决方案,但如果发生错误会发生什么?我希望如果加载数据时出现问题,您最终会得到一些默认错误通知,或者根本没有发生任何事情。最佳做法是通过拦截器处理其他地方的错误,并可能触发事件并以某种通用的非控制器特定方式通知用户?我认为拦截器需要一些方法来确定向用户显示哪些消息以提供一些上下文,例如'装载百吉饼似乎需要比平时更长的时间,点击此处重试'而不是某些请求返回了500状态代码'

1 个答案:

答案 0 :(得分:1)

您仍然可以使用函数速记来传递函数作为查询(成功,错误)。要修复单元测试,您需要考虑错误功能,如下所示:

 spyOn(mockBagelApiService, 'query').and.callFake(function(callback1, callback2) {
    queryDeferred.promise.then(callback1);
    queryDeferred.promise.catch(callback2);
    return {$promise: queryDeferred.promise}
  });

callFake将接收您传递给query()的参数,这两个函数是成功和错误的两个函数。根据promise是否已被解决或拒绝,您需要使用适当的回调来处理then和catch块。

我在角度应用程序中处理请求错误的方法是创建一个错误处理程序服务,该服务在catch块中调用,并将接收特定的错误消息并弹出一个模态。您可以根据需要对其进行配置:您可以定义模式按钮以重新加载或重定向等。为了处理消息,您可以配置服务以返回问题代码,这些代码可以说明情况,例如USER_IS_NOT_AUTH或{ {1}}您的错误处理程序可用于提供更具体的响应。