等待QUnit测试

时间:2011-11-18 14:37:08

标签: javascript jquery 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's NOT the deleted one:
ok(entity.attributes.date.value !== "20110413T000000");

问题当然是在隐藏动画运行结束之前运行ok()测试,因此还没有删除有问题的HTML,并且测试失败。

我尝试了各种延迟/停止测试的方法,但似乎没有任何效果。最明显的一个是使用asynTest并执行

stop();
setTimeout(start, 2000);

但这实际上并没有停止测试。它确实似乎停止某事两秒钟,但我不确定是什么。 : - )

有什么想法吗?

3 个答案:

答案 0 :(得分:21)

您的测试看起来应该是这样的。

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: In QUnit 2.x functions start() and stop() are gone。建议改用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);
    });

答案 1 :(得分:5)

一旦元素的所有动画完成,您可以使用promise函数触发回调。这意味着您需要知道动画在测试中运行的元素(但您不需要知道动画的持续时间)。

答案 2 :(得分:4)

使用你可以做的QUnit断言对象

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

});