我使用ui-router进行Angular,因此我toResolve
SomeController
变量
.state('some.state', {
url: '/some',
controller: 'SomeController',
templateUrl: '/static/views/some-state.html',
resolve: {
toResolve: function(Resource) {
return Resource.get(function(response) {
return response;
});
},
但是如何使用Jasmine测试此功能?假设我忘记了return
语句,因此我的范围中的toResolve
将未定义。
答案 0 :(得分:1)
使用服务使解析器可以高效测试(并且在集成/ e2e测试中也可以模拟)。
注意:Angular服务是单例,状态/路由解析器不是。
如果需要缓存分辨率,可以将解析程序移至factory
服务。
app.factory('someResolver', function(Resource) {
return Resource.get(function(response) {
return response;
})
});
...
resolve: { toResolve: 'someResolver' },
另一方面,如果期望在每次路线更改时评估解析器,则可能导致不合需要的应用行为。在这种情况下,适当的配方可能是constant
注释函数:
app.constant('someResolver', ['Resource', function(Resource) {
return Resource.get(function(response) {
return response;
})
}]);
app.config(function (someResolver, ...) {
...
resolve: { toResolve: someResolver },
...
否则规格可能会以一堆样板代码结束:
var toResolveFactory = $state.get('some.state').resolve.toResolve;
var toResolve = $injector.invoke(toResolveFactory);
答案 1 :(得分:0)
关于相关主题的一篇好文章是http://nikas.praninskas.com/angular/2014/09/27/unit-testing-ui-router-configuration/,但它不是解决方案。一个想法是将另一个对象传递给resolve
,然后分别测试该单元代码,当你解决一堆项目时这是好的。