测试 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);