测试角度解析方法

Test Angular resolve method

本文关键字:方法 测试      更新时间:2023-09-26

我有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将是未定义的。

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

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

如果期望缓存解析,则可以将解析程序移动到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);

关于相关主题的一篇好文章是http://nikas.praninskas.com/angular/2014/09/27/unit-testing-ui-router-configuration/,但这不是解决方案。一种想法是将另一个对象传递给resolve,然后单独测试该代码单元,这在解决一堆项目时很好。