2012-08-16 8 views
5

Ejecutando la siguiente prueba Jasmine (1), la prueba se realiza con éxito pero enfrento la carga recursiva de la página de prueba principal.La página del navegador se actualiza cada vez que prueba las vistas del eje principal con Jasmine

Aquí es mi prueba (1) y aquí el módulo en el que estoy ejecutando la prueba (2):

¿Alguna idea? ¿Cómo puedo solucionar el problema?

P.S .:
El problema se refiere solo al navegador Chrome y Safari.
Aquí es un ejemplo: jsfiddle.net/shioyama/EXvZY


(1)

describe('When Submit button handler fired', function() { 
    beforeEach(function() { 
     spyOn(MyView.prototype, 'submitForm'); 
     this.view = new MyView(); 
     this.view.render(); 
     this.view.$el.find('form').submit(); 
    }); 

    it('submitForm should be called', function() { 
     expect(MyView.prototype.submitForm).toHaveBeenCalled(); 
    }); 
}); 

(2)

var MyView = Backbone.View.extend({ 
    events: { 
     'submit form' : 'submitForm' 
    }, 

    submitForm: function (event) { 
     event.preventDefault(); 
     // some code 
    } 
}); 
+0

He creado un jsFiddle para esta aquí: http://jsfiddle.net/shioyama/EXvZY/8/. La prueba pasa y no veo ninguna carga recursiva, pero tal vez no sé exactamente qué buscar. ¿Puedes aclarar a qué te refieres? –

+0

Disculpa, este es el enlace: http://jsfiddle.net/shioyama/EXvZY/ –

+0

@shioyama, te agradezco por haber creado el jsfiddle. ¿Entendiste lo que quiero decir? –

Respuesta

3

Backbone utiliza eventos de delegado , que están vinculados cuando se crea la vista. Tu view.el no contiene un formulario cuando se crea, sino que estás creando uno en el método de renderizado. Es por eso que el evento delegar enviar no se ve obligado, y en su lugar está enviando el formulario en la página. Ese formulario enviado va a la misma URL, lo que activa el conjunto de aplicaciones Jasmine para que se ejecute de nuevo, lo que da como resultado un bucle.

Si modifica su código un poco, encontrará que esta versión funciona, ya que existe la <forma> elemento antes de generar la vista.

var MyView = Backbone.View.extend({ 
    events: { 
     'submit form' : 'submitForm' 
    }, 

    submitForm: function (event) { 
     event.preventDefault(); 
     // some code 
    } 
}); 

//start test runner right after we're done defining our tests in this script 
window.setTimeout(function(){ 
    jasmine.getEnv().addReporter(new jasmine.TrivialReporter()); 
    jasmine.getEnv().execute(); 
}, 0); 

//TESTS GO HERE 
describe('When Submit button handler fired', function() { 
    beforeEach(function() { 
     spyOn(MyView.prototype, 'submitForm').andCallThrough(); 
     this.view = new MyView({ 
      el: $('<div><form><input type="submit" value="Submit" /></form></div>') 
     }); 
     this.view.$el.find('form').submit(); 
    }); 

    it('submitForm should be called', function() { 
     expect(MyView.prototype.submitForm).toHaveBeenCalled(); 
    }); 
});​ 

+0

Gracias por su respuesta. tu explicación es muy clara De todos modos si creo 'this.view' sin llamar' render' no se llama a 'MyView.prototype.submitForm' cuando realizo la prueba' this.view. $ El.find ('form'). Submit(); ' o 'this.view. $ el.submit();'. ¿Algunas ideas? –

+0

Aquí está la jsfidlle utilizando su sugerencia http://jsfiddle.net/EXvZY/19/ que no funciona. Por favor corrígeme si me perdí algo! –

+0

Dos cosas: # 1: los eventos de delegado usan un selector, por lo que no estarán vinculados al nodo raíz - agregué un div como contenedor & # 2: agregaste un espía, pero no permites que la llamada se propague hasta el elemento espiado, lo que significa que el controlador de envío nunca devolverá falso - necesita agregar .andCallThrough(). –

Cuestiones relacionadas