2013-07-26 19 views
8

Mam pewne problemy implimenting szpiegostwo w JasmineJasmine szpiedzy nie miano

Chcę sprawdzić, czy link został wciśnięty na suwaku wykorzystaniem szpiega jaśminu i jaśmin jQuery.

Oto uproszczona wersja:

mam kilka linków jako część pliku html osprzętu.

<a href="#" class="someLink">Link 1</a> 
<a href="#" class="someLink">Link 2</a> 

suwak:

var Slider = function(links){ 
    this.sliderLinks = $(links); 
    this.bindEvents(); 
} 

Slider.prototype.bindEvents = function(){ 
    this.sliderLinks.on('click', this.handleClick); 
} 

Slider.prototype.handleClick = function(e){ 
    console.log('i have been clicked') 
} 

Spec file:

describe('Slider', function(){ 
    var slider; 

    beforeEach(function(){ 
     loadFixtures('slider.html'); 

     slider = new Slider('.someLink'); 

    }); 

    it('should handle link click', function(){ 
     spyOn(slider, 'handleClick'); 
     $(slider.sliderLinks[0]).trigger('click'); 
     expect(slider.handleClick).toHaveBeenCalled(); 
    }); 

}); 

Test zawodzi. Ale "zostałem kliknięty" został zalogowany na konsoli, więc metoda jest wywoływana.

Gdybym to zrobić testy przechodzi mimo:

it('should handle link click', function(){ 
     spyon(slider, 'handleClick'); 
     slider.handleClick(); 
     expect(slider.handleClick).toHaveBeenCalled(); 
    }); 

Więc moje pytanie jest w istocie:

  1. Am I testowania tego typu rzeczy w niewłaściwy sposób?
  2. dlaczego szpieg nie rejestruje faktu, że metoda została wywołana?
+1

Chyba w tym przypadku zalecana * szpieg na prototypie *: 'spyOn (Slider.prototype, 'handleClick') 'i umieść ten kod przed' Slider' creation 'new Slider (...)' (jak @EliranMalka skomentował). Czy próbowałeś tego? – zbynour

Odpowiedz

17

Właśnie sprawdziłem rozwiązanie opisane w komentarzu. Twój describe powinno być:

describe('Slider', function() { 

    var slider; 

    beforeEach(function() { 
     loadFixtures('slider.html'); 
     spyOn(Slider.prototype, 'handleClick'); 
     slider = new Slider('.someLink'); 
    }); 

    it('should handle link click', function(){ 
     $(slider.sliderLinks[0]).trigger('click'); 
     expect(slider.handleClick).toHaveBeenCalled(); 
    }); 

}); 

Chodzi o to, że masz do szpiegowania prototyp handleClick funkcji i przed czyli do tworzenia Slider.

Powodem jest to, co naprawdę robi Jasmine spyOn w kodzie, który podałeś:

spyOn(slider, 'handleClick'); 

tworzy własność suwak handleClick (zawierający obiekt szpiegowski) bezpośrednio na przykład slider. slider.hasOwnProperty('handleClick') w tym przypadku zwraca true, wiesz ...

Ale nadal istnieje prototypowa właściwość handleClick, z którą związane jest zdarzenie kliknięcia. Oznacza to, że tylko zdarzenie wyzwalane kliknięciem jest obsługiwane przez funkcję prototypu handleClick, podczas gdy obiekt suwaka własność handleClick (Twój szpieg) pozostaje nietknięty.

Więc odpowiedź jest taka, że ​​szpieg nie rejestruje fakt, że metoda została nazwana, ponieważ nigdy nie zostało nazwane :-)

+0

+1 Twoje objaśnienie prototypu vs własnej własności jest na miejscu i nie jest wymienione w żadnym miejscu w dokumentach. Dziękuję bardzo! – dbrin

+0

@dbrin Cieszę się, że pomogę =) – zbynour