2016-03-29 24 views
1

angular.element ile eşleşmek istiyorum. Ve ben angular.element'un belirli bir süre olarak çağrıldığından ve anguler.element.attr'un da çağrıldığından emin olmak istiyorum. Ben benim testteYasemin, Karma ve Köşeli Zincirleme yöntemlerini kullanmaktadır

var things = $scope.getThings(); 

for (var i = 0; i < things.length; i++) { 
    if (things[i].type == "xyz") { 
    angular.element("#thing-" + things[i].id) 
     .attr("foo", things[i].bar); 
    }; 
}; 

:

Aşağıdaki kod var

var things = [ 
    { 
    id: 1, 
    type: "xyz", 
    bar: 10 
    }, 
    { 
    id: 2, 
    type: "abc", 
    bar: 33 
    } 
]; 

spyOn($rootScope, "getThings").and.returnValue(things); 
spyOn(angular, "element").and.returnValue(); 

$rootScope.doThings(); // call controller method 

expect(angular.element.calls.count()).toBe(1); 

Ama şu hatayı veriyor:

TypeError: undefined is not an object (evaluating 'angular.element("#thing-" + things[i].id).attr')

Ben de benim testi istiyorum gibi bir şey var:

expect(angular.element.attr.calls.count()).toBe(1); 
expect(angular.element.attr).tohaveBeenCalledWith("foo", things[0].bar); 

cevap

0

yolu zincirleme yöntemler casusluk veya alay edilmelidir:

var spy; 

beforeEach(function() { 
    spy = spyOn(angular, 'element')..... 
}); 

afterEach(function() { 
    spy.andCallThrough(); 
}); 

Eğer daha bulabilirsiniz. angular.element.prototype veya jQuery.prototype (angular.element === jQuery jQuery yüklendiğinde olarak Açısal jqLite durumunda

veya senin durumunda jQuery (hem şeffaf angular.element cephenin üzerinden yayınlanır) zincirleme yöntemleri fabrika fonksiyonu üzerine maruz yapıcı prototip üzerinde tanımlanır). Her iki angular.element ve casusluk amacıyla

angular.element(...).attr olması gerektiği: aksi takdirde bütün zincir elle stubbed edilmelidir çünkü

spyOn(angular, 'element').and.callThrough(); 
spyOn(angular.element.prototype, 'attr').and.callThrough(); 
... 
expect(angular.element).toHaveBeenCalled(); 
expect(angular.element.prototype.attr).toHaveBeenCalled(); 

callThrough bu durumda önemlidir.

+0

"callThrough" işlevini kullanarak, sınava dahil edilen jQuery kitaplığına ihtiyacım var mı? 'CallThrough' kullanıldığında, birim testi jQuery'yi kullanır ve jQuery bozulursa birim test araları mı demektir? – benjovanic

+0

@benjovanic jQuery'yi sorunuzdaki teknik özelliklerden uzak tutmanız gerektiğini belirtmediniz. Ama evet, onu eklemelisin. Ve hayır, kırılmamalı, yukarıdaki kod, "#thing -..." seçicisi için bir eleman olmasa bile alamaz (jQuery kodu test edildiğinde potansiyel olarak eksik elemanlar için DOM armatürleri gerekir) burada bir sorun değil). – estus

1

bu kodu eklemeyi deneyin: sadece onlar Fark edilmiş nesneler üzerinde nasıl tanımlandığını bağlıdır Jasmin docs

İlgili konular