2013-02-24 17 views
6

Co jest najlepszym sposobem na test z Jasmine, że została nazwana dziedziczona metoda?Jasmine + test odziedziczonej metody została nazwana

Interesuje mnie tylko sprawdzenie, czy został wywołany, ponieważ mam ustawione testy jednostkowe dla klasy bazowej.

przykładem jest:

YUI().use('node', function (Y) { 


    function ObjectOne() { 

    } 

    ObjectOne.prototype.methodOne = function() { 
     console.log("parent method"); 
    } 


    function ObjectTwo() { 
     ObjectTwo.superclass.constructor.apply(this, arguments); 
    } 

    Y.extend(ObjectTwo, ObjectOne); 

    ObjectTwo.prototype.methodOne = function() { 
     console.log("child method"); 

     ObjectTwo.superclass.methodOne.apply(this, arguments); 
    } 
}) 

Chcę przetestować że ObjectTwo za odziedziczone methodOne została wywołana.

Z góry dziękuję.

Odpowiedz

3

Aby to zrobić, możesz sprawdzić metodę w prototypie ObjectOne.

spyOn(ObjectOne.prototype, "methodOne").andCallThrough(); 
obj.methodOne(); 
expect(ObjectOne.prototype.methodOne).toHaveBeenCalled(); 

Jedyne zastrzeżenie tej metody jest to, że nie sprawdzi, czy methodOne nazwano na obiekcie obj. Jeśli chcesz się upewnić, że został wezwany na obj obiektu, można to zrobić:

var obj = new ObjectTwo(); 
var callCount = 0; 

// We add a spy to check the "this" value of the call. // 
// This is the only way to know if it was called on "obj" // 
spyOn(ObjectOne.prototype, "methodOne").andCallFake(function() { 
    if (this == obj) 
     callCount++; 

    // We call the function we are spying once we are done // 
    ObjectOne.prototype.methodOne.originalValue.apply(this, arguments); 
}); 

// This will increment the callCount. // 
obj.methodOne(); 
expect(callCount).toBe(1);  

// This won't increment the callCount since "this" will be equal to "obj2". // 
var obj2 = new ObjectTwo(); 
obj2.methodOne(); 
expect(callCount).toBe(1); 
+0

nie byłoby pozwolić szpiega na ObjectOne.prototype.methodOne po testy wykonywane? Obawiam się, że może to spowodować problemy w innych testach przy użyciu tej metody. Specjalnie dla drugiego przykładu z .andCallFake() – challet

+0

@challet To nie powinno być problemem. Wszyscy szpiedzy są usuwani po każdym teście. – HoLyVieR

Powiązane problemy