Spy sobre eventos en vistas de Backbone

Cuando es necesario generar un spy en una vista de backbone sobre un evento que vamos a disparar más adelante en el test, puede que el spy no esté reaccionando cuando si debería hacerlo. Mejor pongo un ejemplo.

Teniendo en cuenta que esta es la vista:

var View = Backbone.View.extend( {
	events: {
		"click #go": "goPlease"
	},

	goPlease: function() {
		console.log( "gogogo" );
	}
} );

Y este es el test correspondiente…

describe( "View", function() {
	it( "should show call goPlease once go is clicked", function() {
		var oView = new View();

		spyOn( oView, "goPlease" );

		oView.render();
		oView.$( "#go" ).click();

		expect( oView.goPlease.calls.length ).toBe( 1 );
	} );
} );

Cómo se puede apreciar en el ejemplo, estamos haciendo spy sobre el método goPlease de la vista pero a pesar de ello y después de disparar el evento click, el test seguirá fallando.

La solución es sencilla, debemos notificar a la vista de backbone que recargue los eventos para apuntar a la nueva función espiada, lo hacemos llamando el método delegateEvents sobre la vista, de tal forma que el test nos quedaría de esta manera:

describe( "View", function() {
	it( "should show call goPlease once go is clicked", function() {
		var oView = new View();

		spyOn( oView, "goPlease" );

		oView.delegateEvents();
		oView.render();
		oView.$( "#go" ).click();

		expect( oView.goPlease.calls.length ).toBe( 1 );
	} );
} );

Con esto ahora el evento disparado será el mismo que hemos espiado con lo que el test pasará en verde.

Corre la voz!

Comentarios


Escribir un comentario

Escribe lo que desees, si quieres incluir código hazlo usando los tags <pre>

Nombre:
Email:
Website: