测试角度解析方法

时间:2016-05-17 14:09:26

标签: javascript angularjs angular-ui-router jasmine karma-jasmine

我使用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未定义

2 个答案:

答案 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,然后分别测试该单元代码,当你解决一堆项目时这是好的。