2016-03-30 48 views
0

我想单元测试使用$resource的AngularJS服务。为了保持它的独立性,我想用茉莉花的间谍和间谍在$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状态代码'

回答

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_AUTHOAUTH_ERROR您的错误处理程序可以用来提供更具体的响应。