测试 Angular 解析方法
Test Angular resolve method
我有 Angular 和 ui-路由器,所以 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
将是 undefined.
一篇关于相关主题的好文章是 http://nikas.praninskas.com/angular/2014/09/27/unit-testing-ui-router-configuration/,但这不是解决方案。一个想法是将另一个对象传递给 resolve
,然后分别测试该代码单元,这在解析一堆项目时非常有用。
使用服务使解析器可有效测试(并且在 integration/e2e 测试中也可模拟)。
注意:Angular 服务是单例,state/route 解析器不是。
如果需要缓存解析,解析器可能会移至 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);
我有 Angular 和 ui-路由器,所以 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
将是 undefined.
一篇关于相关主题的好文章是 http://nikas.praninskas.com/angular/2014/09/27/unit-testing-ui-router-configuration/,但这不是解决方案。一个想法是将另一个对象传递给 resolve
,然后分别测试该代码单元,这在解析一堆项目时非常有用。
使用服务使解析器可有效测试(并且在 integration/e2e 测试中也可模拟)。
注意:Angular 服务是单例,state/route 解析器不是。
如果需要缓存解析,解析器可能会移至 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);