2011-11-18 17 views
15

tengo código de jQuery que cuando hago clic en un enlace de TI primeros cueros y luego quita algo de HTML, así:Esperando en QUnit pruebas

$(this).parent().parent().hide('slow', function() { 
    $(this).remove(); 
}); 

Quiero hacer una prueba QUnit que se asegura de que el HTML en cuestión se ha eliminado:

$(thelink).click(); 

// Check that it is gone, by finding the first item in the list 
entity = input.form.find('.recurrenceinput_occurrences .occurrence span.action a')[0]; 
// And make sure it's NOT the deleted one: 
ok(entity.attributes.date.value !== "20110413T000000"); 

el problema es, por supuesto, que la prueba bien() se ejecuta antes de la piel de animación se ha quedado a su fin, por lo que el HTML offenting no se ha quitado todavía, y la prueba falla .

He intentado varias formas de retrasar/detener la prueba durante un segundo, pero nada parece funcionar. El más obvio es usar un asynTest y hacer

stop(); 
setTimeout(start, 2000); 

Pero esto en realidad no detiene la prueba. Parece detener algo durante dos segundos, pero no estoy seguro de qué. :-)

¿Alguna idea?

Respuesta

21

Su prueba debería verse más o menos así.

test('asynchronous test', function() { 
    stop(); // Pause the test 
    //Add your wait 
    setTimeout(function() { 
     //Make assertion 
     ok(true); 
     // After the assertion called, restart the test 
     start(); 
    }, 1000); 
}); 
+0

Bingo! Ese era el orden correcto de las cosas. :-) Entonces, ¿stop() en realidad solo detiene la finalización de la prueba? –

+1

Este enfoque estaba en desuso (http://qunitjs.com/upgrade-guide-2.x/#replace-stop-and-start-with-assert-async). La respuesta de @ ekcrisp usa el nuevo enfoque. – Joe

+0

Qué sorpresa que algo que se pidió hace 6 años está en desuso. lol – epascarello

5

Se puede usar la función promise para disparar una devolución de llamada una vez que hayan terminado todas las animaciones de un elemento. Esto implica que necesita saber en qué elementos se ejecutan las animaciones en la prueba (pero no es necesario saber cuánto tiempo dura la animación).

+0

Es una idea interesante, pero estoy atrapado en jQuery 1.4 en este momento, por lo que no se puede hacer. –

4

utilizando el objeto de afirmar QUnit que puede hacer

test("async test", function (assert) { 
    var done = assert.async(); 
    setTimeout(function() { 
      delayedPartOfTest(); 
      done(); 
     }, 20000); 
    }) 

}); 
Cuestiones relacionadas