2013-03-08 80 views
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 $滤波器更换$控制器不工作,因为我相信滤波器由角构造不同(即不允许你注入当地人作为构造函数的第二个参数。)

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

回答

13

好吧,想通了这个主要归功于 this答案。

诀窍是简单地覆盖服务的工厂供应商,每个使用前角mocks.js模型功能的(角度只需要最后一个定义的工厂又好像)

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

我怀疑我需要在测试之间谨慎拆卸,但注入过滤器现在可以正常工作。

相关问题