Ожидание в тестах QUnit - PullRequest
15 голосов
/ 18 ноября 2011

У меня есть код 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's NOT the deleted one:
ok(entity.attributes.date.value !== "20110413T000000");

Проблема, конечно, в том, что тест ok () выполняется до того, как анимация скрытия завершилась, поэтому исходный HTML-код еще не удален, и тест завершается неудачно..

Я пробовал разные способы отложить / остановить тест на секунду или около того, но, похоже, ничего не работает.Наиболее очевидным является использование asynTest и выполнение

stop();
setTimeout(start, 2000);

Но это на самом деле не останавливает тест.Кажется, это останавливает что-то на две секунды, но я не уверен, что.: -)

Есть идеи?

Ответы [ 3 ]

21 голосов
/ 18 ноября 2011

Ваш тест должен выглядеть примерно так.

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().Обновленный код выглядит так:

    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);
    });
5 голосов
/ 18 ноября 2011

Вы можете использовать функцию promise для запуска обратного вызова после завершения всех анимаций для элемента. Это подразумевает, что вам нужно знать, на каких элементах анимация запускается в тесте (но вам не нужно знать, какова длина анимации).

4 голосов
/ 13 апреля 2016

используя объект QUnit assert, вы можете сделать

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

});
...