2013-07-26 5 views
8

Sto avendo qualche problema implimenting spionaggio in JasmineJasmine spie non essere chiamati

voglio verificare se un link è stato cliccato su un cursore con una spia di gelsomino e gelsomino jQuery.

Ecco una versione semplificata:

ho alcuni collegamenti come parte di un file fixture HTML.

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

cursore:

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

file spec:

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

}); 

La prova sta venendo a mancare. Ma il 'sono stato cliccato' è stato registrato nella console in modo che venga chiamato il metodo.

Se faccio questo il test viene superato se:

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

Quindi la mia domanda è in sostanza:

  1. sono io il test per questo tipo di cose nel modo sbagliato?
  2. perché la spia non registra il fatto che il metodo è stato chiamato?
+1

Credo che in questo caso si dovrebbe * spia sul prototipo *: 'spyOn (Slider.prototype, 'handleClick') 'e metti questo codice prima della' Slider' creazione 'new Slider (...)' (come commentato @EliranMalka). Hai provato questo? – zbynour

risposta

17

Ho appena verificato la soluzione delineata nel commento. Il tuo describe dovrebbe essere:

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

}); 

Il punto è che si deve spiare prototipo handleClick funzione e prima della creazione Slider.

Il motivo è quello che Jasmine spyOn davvero nel codice che hai fornito:

spyOn(slider, 'handleClick'); 

crea proprietà di scorrimento handleClick (che contiene l'oggetto di spionaggio) direttamente sull'istanza slider. slider.hasOwnProperty('handleClick') in questo caso restituisce true, lo sai ...

Ma ancora, c'è la proprietà di prototipo handleClick a cui è associato l'evento di clic. Ciò significa che l'evento click appena attivato viene gestito dalla funzione prototipo handleClick mentre la proprietà dell'oggetto slider proprietaria handleClick (la spia) rimane inalterata.

Quindi la risposta è che la spia non registra il fatto che il metodo è stato chiamato perché non è mai stato chiamato :-)

+0

+1 la tua spiegazione del prototipo rispetto alla propria proprietà è azzeccata e non è menzionata da nessuna parte nei documenti. grazie mille! – dbrin

+0

@dbrin Felice di aiutare =) – zbynour