2013-03-08 14 views
9

Mam prosty filtr angularjs (trwa id i konwertuje go na ciąg nazwy), który zależy od usługi niestandardowe, aby zrobić swoją pracę:Jak mogę wstrzyknąć próbną usługę do testu jednostkowego dla filtra?

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; 
    }; 
    } 
); 

i chcę napisać badanej jednostki dla niego . Chciałbym móc wstrzyknąć próbkę usługi User do testu.

można zrobić to za pomocą testów jednostkowych kontroler jak pokazano w dokumentacji:

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 
    }); 
})); 

ale zastępując $ kontroler z $ filtra w beforeEach nie działa, jak przypuszczam, filtry są skonstruowane inaczej kątowe (tzn. nie pozwalaj na wstrzykiwanie locals jako drugiego parametru do konstruktora.)

Czy ktoś już kiedyś to odkrył/rozwiązał?

Odpowiedz

13

Ok, zorientowaliśmy się, dzięki w dużej mierze do this odpowiedź.

Sztuką było po prostu zastąpić dostawcę fabrycznej usługi, za pomocą funkcji modelu kątowe-mocks.js w sposób przed siebie (kanciasty tylko wykonuje ostatnio zdefiniowany fabrycznie wydawałoby)

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

I podejrzewam, że muszę być ostrożny przy rozbieraniu między testami, ale wtrysk do filtra działa dobrze.

Powiązane problemy