Ожидание тестов QUnit
У меня есть код jQuery, который, когда я нажимаю ссылку, сначала скрывает, а затем удаляет некоторый HTML, например:
$(this).parent().parent().hide('slow', function () {
$(this).remove();
});
Я хочу сделать тест QUnit, который гарантирует, что HTML-вопрос был удален:
$(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 NOT the deleted one:
ok(entity.attributes.date.value !== "20110413T000000");
Проблема заключается в том, что тест ok() запускается до того, как анимация hide завершилась, поэтому HTML-код обитания еще не удалён, и тест завершился неудачно.
Я пробовал различные способы задержки или остановки теста на секунду или около того, но ничего не работает. Наиболее очевидным является использование asynTest и do
stop();
setTimeout(start, 2000);
Но это фактически не останавливает тест. Кажется, что-то останавливается на две секунды, но я не уверен, что.: -)
Любые идеи?
Ответы
Ответ 1
Ваш тест должен выглядеть примерно так.
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);
});
UPD: В QUnit 2.x функции start() и stop() пропали. assert.async()
этого рекомендуется использовать assert.async()
. Обновленный код выглядит так:
test('asynchronous test', function() {
var done = assert.async();
//Add your wait
setTimeout(function() {
//Make you assertion
ok(true);
// Tell QUnit to wait for the done() call inside the timeout.
done();
}, 1000);
});
Ответ 2
Вы можете использовать функцию promise
для запуска обратного вызова после завершения всех анимаций для элемента. Это означает, что вам нужно знать, на каких элементах анимации запускаются в тесте (но вам не нужно знать, как долго будет анимация).
Ответ 3
с помощью объекта QUnit assert, который вы можете сделать
test("async test", function (assert) {
var done = assert.async();
setTimeout(function() {
delayedPartOfTest();
done();
}, 20000);
})
});