9

我有一个简单的 angularjs 过滤器(它需要一个 id 并将其转换为一个名称字符串),这取决于一个自定义服务来完成它的工作:

angular.module('app').filter('idToName',
  function(User) {
    return function(id) {
      var result, user;
      result = '';
      if (id) {
        result = 'no name found';
        user = User.getById(id);
        if (user) {
          result = user.firstName;
        }
      }
      return result;
    };
  }
);

我想为它写一个单元测试。我希望能够将用户服务的模拟注入到测试中。

我可以为控制器单元测试执行此操作,如文档中所示:

var mockUserService;

mockUserService = {
  getById: function(id) {
    return {
      firstName: 'Bob'
    };
  }
};

beforeEach(inject(function($rootScope, $controller) {
  var ctrl, scope, userService;
  userService = mockUserService;
  scope = $rootScope.$new();
  return ctrl = $controller('someController', {
    $scope: scope,
    User: userService
  });
}));

但是在 beforeEach 中用 $filter 替换 $controller 不起作用,因为我认为过滤器的构造方式不同(即不允许您将本地变量作为构造函数的第二个参数注入。)

有没有人遇到过这个/解决过这个?

4

1 回答 1

13

好的,主要归功于 这个答案。

诀窍是通过在每个之前使用 angular-mocks.js 模型函数来简单地覆盖服务的工厂提供者(角度只是采用它看起来的最后定义的工厂)

beforeEach(module(function($provide) {
  $provide.factory('User', function() {
    var getSync;
    getById = function(id) {
      return {
        firstName: 'Bob'
      };
    };
    return {
      getById: getById
    };
  });
}));

我怀疑我需要小心在测试之间进行拆卸,但是现在注入过滤器可以正常工作。

于 2013-03-09T00:01:05.397 回答