2012-07-17 12 views
12

Estoy escribiendo un simple controlador de clic y necesitan el evento pasado en (al igual que)¿Cómo afirmar un espía se invoca con evento al hacer clic con jazmín?

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

Actualmente en mi especificación jazmín Tengo algo para espiar a la función espero que se invoca (pero ya que es llamada con e -no sin args- mi afirmación está fallando)

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

¿Cómo puedo corregir este "toHaveBeenCalledWith" trabajar como esperaba?


ACTUALIZACIÓN

no pude conseguir la respuesta aceptada para trabajar como es, pero yo era capaz de alterar sólo un poco, y el siguiente es mi 100% ejemplo de trabajo

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

Respuesta

13

Tiene que desencadenar su propio evento pasando un espía para el método stopPropagation, porque quiere probar si el evento se detuvo.

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

Nota: no hay olor código cuando usted espía en el objeto que desea probar, porque se empieza a probar el comportamiento interno de su clase. Piensa en tu función como una caja negra y prueba solo las cosas que colocas y sales. En su caso, cambiar el nombre de la función en romperá la prueba, mientras que el código sigue siendo válido.

Cuestiones relacionadas