2015-01-15 16 views
9

Aşağıdaki yöntemi test bir sorun birimi yaşıyorum kullanarak zincirleme yöntemi test etmek okunamıyor tanımsız malı 'arama'):nasıl ünitesi Jasmine'i

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

Ben aşağıda benim işlevini değiştirmek ise, test geçer:

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

Yöntem zincirleme kullanırken bu yöntemi nasıl test edebilirim? $ LocationMock'umu farklı şekilde ayarlamanız mı gerekiyor? Hayatım boyunca bunu anlayamıyorum.

cevap

18

aramayı çağırarak.

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

Ya da sadece bir casus nesnesi (daha az kod) oluşturmak: eklemek

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

ve

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

ya:

var $locationMock = jasmine.createSpyObj('locationMock', ['path', 'search']); 
Size alay değiştirebilir Jasmine 2.0 Kullanımı

ve

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

Jasmine 1.x kullanıyordum, böylece .and.returnValue() başarısız oldu. Bu olsa da Jasmine 2.0 için harika çalışıyor. 1.x ile çalışmasını sağlamak için .and.returnValue() yöntemini .andReturns() olarak değiştirdim. Yakında Yasemin'i yükselteceğim. Yardım için teşekkürler! – nweg

+0

@nweg Bir şey değil. Düzenleme için teşekkürler. :) – PSL

+0

İşaretçi için @PSL'ye teşekkürler. Zincirleme yapılacak yöntemlerde aynı nesneyi döndürmek (oluşturucu modeli) burada anahtardır. Düzgün resimli. – Rajaraman

0

deneyin:

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

Else you'r bir mock değil sahte aracılığıyla zincirine edebilmek için konum nesnesi dönmez çünkü $ konum

İlgili konular