我有一个简化的QUnit测试,它由2个简单的测试组成,这些测试无缘无故地交替失败(它们都是原子的,意味着一个测试不会改变其他元素的任何内容)
请参阅 this jsFiddle 多次尝试运行
module("Basic actionBind");
//two simple tests
test("action1", function() {
ok(ele2.trigger("click").hasClass("clicked"), "basic click action");
});
test("action2", function() {
ok(ele1.click().hasClass("clicked"), "basic click action");
});
答案 0 :(得分:8)
问题在于在运行时缓存全局上下文中的jQuery对象。以下是代码中的两个代码段(来自问题中的链接:http://jsfiddle.net/adardesign/aZRK7/12/):
HTML:
<div id="qunit-fixture">
<span id="ele1" class="action" data-action="action1"></span>
<span id="ele2" class="action" data-action="action2" ></span>
</div>
JS:
// caching elements
var $ele1 = $('#ele1'),
$ele2 = $('#ele2');
test('action1', function() {
ok($ele2.trigger('click') ....
test('action2', function () {
ok($ele1.trigger('click') ....
实际元素在#qunit-fixture
内部,为每个测试重置并重新解析,因此从测试内部触发的单击事件在现在不再在{{1 }}。相反,这些元素已经分离,document
已经从原始的html文本中重新解析,从而创建了新的DOM元素。
我已经分叉你的jsFiddle并相应修改它:http://jsfiddle.net/aZRK7/15/
虽然我在注意到它之前清理了各个部分,但基本的改变是将元素的查询移到测试内部:
#qunit-fixture
答案 1 :(得分:0)
编辑:看起来OP取出了代码的异步部分,留下答案,以防任何绊倒,但它现在没有回答问题。
好吧,我不确定您可能会遇到哪些问题,但是任何AsyncTest都必须在某个地方进行start();
调用。所以从你的小提琴:
asyncTest("action1", delay.bind(null, function() {
console.log("test1");
ok(ele2.trigger("click").hasClass("clicked"), "basic click action");
start();
}, 2000*Math.random()));
从QUnit asyncTest documentation开始,查看他们的示例。