2012-07-17 4 views
12

Sto scrivendo un semplice gestore di click e hanno bisogno l'evento passata (in questo modo)Come affermare che una spia viene invocata con evento al clic usando jasmine?

Thing = function($){ 

    var MyObject = function(opts){ 
     this.opts = opts; 
    }; 

    MyObject.prototype.createSomething = function(){ 
     var that = this; 
     $('#some_dom_element').live('click', function(e) { 
      that.doStuff(e); 
     }); 
    }; 

    MyObject.prototype.doStuff = function(e) { 
     //do some javascript stuff ... 
     e.preventDefault(); 
    }; 

    return MyObject; 

}(jQuery); 

Attualmente nel mio gelsomino spec Ho qualcosa per spiare la funzione mi aspetto che viene invocato (ma dato che è chiamato con e -non senza args- mia affermazione sta venendo a mancare)

it ("live click handler added to the dom element", function(){ 
     var doSpy = spyOn(sut, 'doStuff'); 
     sut.createSomething(); 
     $("#some_dom_element").trigger('click'); 
     expect(doSpy).toHaveBeenCalledWith(); 
    }); 

come posso correggere questo "toHaveBeenCalledWith" per lavorare come mi aspetto?


UPDATE

non ho potuto ottenere la risposta accettata a lavorare come è, ma sono stato in grado di modificare solo un po 'e il sotto è il mio esempio funzionante al 100%

it ("should prevent default on click", function(){ 
     var event = { 
      type: 'click', 
      preventDefault: function() {} 
     }; 
     var preventDefaultSpy = spyOn(event, 'preventDefault'); 
     sut.createSomething(); 
     $("#some_dom_element").trigger(event); 
     expect(preventDefaultSpy).toHaveBeenCalledWith(); 
    }); 

risposta

13

Devi attivare il tuo evento passando una spia per il metodo stopPropagation, perché vuoi verificare se l'evento è stato interrotto.

var event = { 
    type: 'click', 
    stopPropagation: function(){} 
} 
var spy = spyOn(event, 'stopPropagation'); 
$('#some_dom_element').trigger(event); 
expect(spy).toHaveBeenCalled(); 

Nota: c'è il codice odore quando cerchi di spiare l'oggetto che si desidera eseguire il test, perché si inizia a testare il comportamento interno della classe. Pensa alla tua funzione di una scatola nera e metti alla prova solo le cose che hai messo ed esci. Nel tuo caso, la ridenominazione della funzione interromperà il test, mentre il codice è ancora valido.