Angular Jasmine SpyOn $resource 处理错误

Angular Jasmine SpyOn $resource Handle Errors

我正在尝试对使用 $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() 的 return 值分配给一个数组,并且随着数据的加载,数组将会被更新。这是最干净的解决方案,但如果发生错误怎么办?我希望如果加载数据出现问题,您最终会得到一些默认的错误通知,或者什么也没有发生。最好的做法是通过拦截器在其他地方处理错误并可能触发事件并以某种通用的非控制器特定方式通知用户吗?我认为拦截器需要某种方式来确定向用户显示什么消息以提供一些上下文,例如 'Loading of Bagels seems to be taking longer than usual, click here to retry' 而不是 'some request returned a 500 status code'

您应该仍然可以使用函数 shorthand,您将函数作为 query(success, error) 传入。要修复单元测试,您需要考虑错误函数,如下所示:

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

callFake 会接受你传给 query() 的参数,这是成功和错误的两个函数。根据承诺是已解决还是已拒绝,您需要使用适当的回调处理 then 和 catch 块。

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