2011-09-06 16 views
13

Tengo 1 segundo jQuery .animate acción que se inicia 5 segundos después de la carga de la página. Configuré un temporizador Sinon en mi código de prueba de la unidad Jasmine y lo compruebo después de un tic de 7 segundos para ver si las propiedades posteriores a la animación son como deberían ser.¿Cómo reproduzco una animación de jQuery con Sinon en una prueba de unidad de jazmín?

No funciona bien, así que coloqué una instancia de la animación en mi página de prueba HTML de Jasmine para ver mejor lo que está sucediendo.

  • En Firefox y Chrome, se carga la página, la función de animación se llama, la prueba de la unidad falla inmediatamente y, a continuación (también inmediatamente) la animación se produce visiblemente.

  • En IE, Opera y Safari, la página carga, se llama a la función de animación, la prueba de unidad falla inmediatamente y la animación nunca se produce de forma visible.

lo que esperaba era el siguiente (en todos los navegadores):

  • Las cargas de la página, la función de animación se llama, la animación se completa de forma instantánea, y la prueba de la unidad tiene éxito inmediatamente.

En cuanto a Sinon's documentation, es temporizadores falsos cubren los siguientes procesos: setTimeout, clearTimeout, setInterval, clearInterval, Date

No sé cómo funciona la animación de jQuery, pero me imagino que está usando CSS para transición, y las transiciones CSS no están cubiertas en Sinon useFakeTimers, así que me imagino que este es el problema. Sin embargo, si estoy en lo cierto sobre el problema, aún necesito una solución.

Tal vez debería probar algo diferente a Sinon? El waits() de Jasmine funciona perfectamente en esta prueba, pero es increíblemente poco práctico para personas impacientes como yo.

¿Alguna otra sugerencia? Tenga en cuenta que soy nuevo en las pruebas de unidad de JS, por lo que las respuestas imprecisas me confundirán más que me ayudarán. ; o)

+0

Ha sido un par de días y nadie ha respondido. Lo que estoy haciendo ahora, para resolver esto, es utilizar la funcionalidad de espera de Jasmine(). Ha funcionado bien, aunque las pruebas no son instantáneas sino que se completan en tiempo real. Shucks. Por favor publique cualquier otra idea que pueda tener para mí. Gracias. – gcdev

+0

hey! ¿Encontraste alguna nueva solución a este problema? La respuesta $ .fx.off funciona perfectamente, pero todavía no es la forma en que debería ser ... –

+0

No lo hice. He estado usando espera(). En realidad, me había olvidado de esta pregunta. Pero viendo que la solución de Derek es más simple que la de Alex y tiene varios votos a su favor (por lo que probablemente funcione para otros), lo probaré y lo marcaré como la respuesta si funciona para mí. – gcdev

Respuesta

18

Puede utilizar jQuery off para apagar efectos jQuery:

jQuery.fx.off = true 

Esto no resolverá el problema de la inital 7 segundos de espera para su evento para disparar pero sí significa que usted puede probar que el DOM tiene cambiado como esperabas

+0

gracias. funciona bien, y (¿por desgracia?) hace que los sinon.useFakeTimers sean redundantes ... –

4

He tenido el mismo problema. Creo que sucede porque la animación de jQuery toma ventaja de requestAnimationFrame() si está disponible en lugar de confiar en setTimeout().

He trabajado alrededor de este problema estableciendo todos requestAnimationFrame funciones específicas de cada navegador del objeto window a nulo:

window.webkitRequestAnimationFrame = null; 
window.mozRequestAnimationFrame = null; 
window.oRequestAnimationFrame = null; 

asegurarse de que este código se ejecuta antes de se carga jQuery.

+0

Esto no funcionó para mí cuando usé jazmín + jquery + sinon.js. Incluso me aseguré de que se cargara como una dependencia src antes de cualquiera de mis archivos de especificaciones o incluso jquery. Tal vez hice algo mal? Lo extraño es que, cuando realizo la prueba solo (sin ningún otro), pasa. – thekingoftruth

1

creo que es posible con SinonJs ya que mostraba aquí: http://sinonjs.org/qunit

test("should animate element over 500ms", function() { 
    var el = jQuery("<div></div>"); 
    el.appendTo(document.body); 

    el.animate({ height: "200px", width: "200px" }); 
    this.clock.tick(510); 

    equals("200px", el.css("height")); 
    equals("200px", el.css("width")); 
}); 
Cuestiones relacionadas