2

我有角与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; 
      }); 
     }, 

内解决,但如何测试茉莉这个功能?假设我忘记return声明,因此我范围内的toResolve将是undefined

+0

为什么要测试内部AngularJS功能,可能它的工作原理以完美的方式 –

+0

这不是内部,它是一个简单的测试用例,例如'expect($ scope.toResolve).not.toBeUndefined();'当我可能想要返回例如 –

+0

@KrzysztofSafjanowski:无论如何,一切都必须可测试如果我想我应该能够模拟任何组件并测试任何组合那些无论内在与否 –

回答

1

使用服务使解析器可以有效地测试(也可以在集成/ e2e测试中进行模拟)。

注意:角度服务是单例,状态/路由解析器不是。

如果预计缓存解决方案,解析器可能会被移动到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); 
+0

伟大的,这正是我所期待的。对你来说另一个小问题:我的规范中的$ injector是从哪里来的? –

+1

@MostWanted你需要在规范中注入'$ injector'服务来测试解析器的'constant'和'$ state.get ...'风格('factory'不需要)。 – estus