2013-03-08 86 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 
    }; 
    }); 
})); 

我懷疑我需要在測試之間謹慎拆卸,但注入過濾器現在可以正常工作。

相關問題