0

我正在尝试对使用$resource. 为了保持隔离,我想使用 Jasmine 的 spyOn 和 spy on$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()给一个数组,并且随着数据的加载,该数组将被更新。这是最干净的解决方案,但如果发生错误怎么办?我希望如果加载数据时出现问题,您最终会收到一些默认错误通知,或者根本没有发生任何事情。通过拦截器在其他地方处理错误并可能触发事件并以某种通用的非控制器特定方式通知用户的最佳实践是什么?我认为拦截器需要某种方式来确定向用户显示什么消息以提供一些上下文,例如“加载百吉饼似乎需要比平时更长的时间,单击此处重试”而不是“某些请求返回 500状态码'

4

1 回答 1

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

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

于 2016-03-30T03:20:53.080 回答