2011-11-18 7 views
15

Mam kodu jQuery, że po kliknięciu na link, najpierw skór i następnie usuwa niektóre HTML, tak jak poniżej:Oczekiwanie na QUnit testuje

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

chcę zrobić test QUnit który zapewnia, że ​​HTML o którym mowa, został usunięty:

$(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"); 

problemem jest to, oczywiście, że ok() badanie przeprowadzane jest przed ukryj animacji biec do końca, więc HTML offenting nie został jeszcze usunięty, a test nie powiedzie się .

Próbowałem różnych sposobów opóźnienia/zatrzymania testu przez sekundę, ale nic nie działa. Najbardziej oczywistym z nich jest użycie testu asynTest i wykonanie tej operacji. Nie powoduje to jednak zatrzymania testu. To wydaje się zatrzymywać coś przez dwie sekundy, ale nie jestem pewien co. :-)

Jakieś pomysły?

Odpowiedz

21

Twój test powinien wyglądać mniej więcej tak.

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! To był właściwy porządek rzeczy. :-) Więc stop() faktycznie zatrzymuje test dopiero po zakończeniu? –

+1

To podejście zostało wycofane (http://qunitjs.com/upgrade-guide-2.x/#replace-stop-and-start-with-assert-async). Odpowiedź @ ekcrisp wykorzystuje nowe podejście. – Joe

+0

Co za niespodzianka, że ​​coś, co zostało zadane 6 lat temu, jest przestarzałe. lol – epascarello

5

Można użyć funkcji promise na ogień oddzwanianie, gdy wszystkie animacje dla elementu są wykończone. Oznacza to, że musisz wiedzieć, na jakich elementach są uruchamiane animacje (ale nie musisz wiedzieć, jak długo trwa animacja).

+0

To ciekawy pomysł, ale utknąłem w tej chwili na jQuery 1.4, więc nie można tego zrobić. –

4

pomocą wymuszenia obiekt QUnit można zrobić

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

});