Angular Jasmine SpyOn$resource处理错误

Angular Jasmine SpyOn $resource Handle Errors

本文关键字:处理 错误 resource Jasmine SpyOn Angular      更新时间:2023-09-26

我正在尝试对使用$resource的AngularJS服务进行单元测试。为了将其隔离,我想使用Jasmine的spyOn并监视$resourcequery()方法。在我的控制器中,我希望能够使用query()的缩写,在这里,您可以将成功和错误函数直接传递给查询方法,而无需调用$promise.then(success, error)。这可能吗,还是我一直使用query().$promise.then(success, error)的长形式?

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

我在SO上发现了几个问题,声称可以解决这个问题,但所有问题都使用了我正在使用的组件的旧版本。从plunker中,你可以看到我正在使用Angular 1.5.2和Jasmine 2.4.1。

作为一个相关的问题,许多教程显示,在控制器中,您只需将query()的返回值分配给一个数组,当加载数据时,数组就会更新。这是最干净的解决方案,但如果出现错误会发生什么?我预计,如果加载数据时出现问题,您最终会收到一些默认的错误通知,或者什么都没发生。最好的做法是通过拦截器处理其他地方的错误,并可能触发事件并以某种通用的非控制器特定的方式通知用户吗?我认为拦截器需要某种方式来确定向用户显示什么消息以提供一些上下文,例如"Bagels的加载似乎比平时花费了更长的时间,单击此处重试",而不是"某个请求返回了500状态代码"

您应该仍然能够使用函数简写,将函数作为查询传递(成功,错误)。要修复单元测试,您需要考虑如下所示的错误函数:

 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块。

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