2015-01-15 11 views
9

ich die folgenden Methode ein Problem Einheit Testen:Wie Einheit eine verkettete Methode testet Jasmin mit

$scope.changeLocation = function (url) { 
     $location.path(url).search({ ref: "outline" }); 
    }; 

ich folgenden Unit-Test geschrieben habe, die derzeit mit diesem Fehler (Typeerror nicht: kann nicht lesen Eigenschaft 'Suche' undefinierter):

var $locationMock = { path: function() { }, search: function() { } }; 

it('changeLocation should update location correctly', function() { 
     $controllerConstructor('CourseOutlineCtrl', { $scope: $scope, $location: $locationMock }); 

     var url = "/url/"; 
     spyOn($locationMock, "path"); 
     spyOn($locationMock, "search"); 

     $scope.changeLocation(url); 

     expect($locationMock.search).toHaveBeenCalledWith({ ref: "outline" }); 
     expect($locationMock.path).toHaveBeenCalledWith(url); 
    }); 

Wenn ich meine Funktion der folgenden ändern, hat der Test:

$scope.changeLocation = function (url) { 
     $location.path(url); 
     $location.search({ ref: "outline" }); 
    }; 

Wie kann ich diese Methode testen, wenn ich Methodenverkettung verwende? Muss ich meinen $ locationMock anders einrichten? Für das Leben von mir kann ich das nicht herausfinden.

Antwort

18

Das ist, weil Ihr Mock nicht Position zurückkehrt Objekt Kette durch zu können. Mit Jasmin 2.0 Sie Ihre Mock ändern können:

var $locationMock = { path: function() { return $locationMock; }, 
         search: function() { return $locationMock; } }; 

und

spyOn($locationMock, "path").and.callThrough(); 
spyOn($locationMock, "search").and.callThrough(); //if you are chaining from search 

oder hinzufügen:

spyOn($locationMock, "path").and.returnValue($locationMock); 
spyOn($locationMock, "search").and.returnValue($locationMock); //if you are chaining from search 

oder ein Spion Objekt nur erstellen (weniger Code):

var $locationMock = jasmine.createSpyObj('locationMock', ['path', 'search']); 

und

$locationMock.path.and.returnValue($locationMock); 
$locationMock.search.and.returnValue($locationMock); //if you are chaining from search 
+1

Ich habe Jasmine 1.x verwendet, so dass die .and.returnValue() fehlgeschlagen ist. Das funktioniert großartig für Jasmine 2.0. Ich habe die .and.returnValue() in .andReturns() geändert, damit es mit 1.x funktioniert. Ich werde bald Jasmine upgraden. Danke für die Hilfe! – nweg

+0

@nweg Gern geschehen. Danke für die Bearbeitung. :) – PSL

+0

Danke @PSL für den Zeiger. Die Rückgabe des gleichen Objekts in den zu verkettenden Methoden (Builder-Muster) ist hier der Schlüssel. Ordentlich illustriert. – Rajaraman

0

Versuch:

spyOn($locationMock, "path").and.callThrough(); 

Else Aufruf you'r Suche auf einem Mock nicht $ location

Verwandte Themen