2013-03-08 9 views
9

ich ein einfaches AngularJS Filter haben (es dauert eine ID und wandelt es in eine Namenszeichenfolge), das hängt von einem benutzerdefinierten Dienst seine Arbeit zu tun:Wie kann ich einen Schein-Service in einen Komponententest für einen Filter injizieren?

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

und ich möchte ein Unit-Test für sie schreiben . Ich würde gerne in der Lage sein, den User Service in den Test zu verspotten.

ich dies für einen Controller Unit-Test tun können, wie in der Dokumentation gezeigt:

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

aber $ Controller mit $ Filter in der before ersetzt nicht funktioniert, wie ich Filter vermuten unterschiedlich durch Winkel aufgebaut (dh erlauben Sie nicht, Locals als zweiten Parameter in den Konstruktor zu injizieren.)

Hat jemand dieses Problem schon einmal gelöst?

Antwort

13

Ok, herausgefunden, dass dies weitgehend dank this Antwort.

Der Trick war einfach die Fabrik Anbieter des Dienstes außer Kraft setzen, indem vor jedem in einem Winkel mocks.js Modell-Funktion (Winkel nur die letzte definierte Fabrik nimmt es scheinen würde)

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

I vermute, dass ich zwischen den Tests mit dem Teardown vorsichtig sein muss, aber die Injektion in den Filter funktioniert jetzt gut.

Verwandte Themen