5

我有一个简化的 QUnit 测试,它由 2 个简单的测试组成,这些测试无缘无故地随机/交替失败(它们都是原子的,这意味着一个测试不会改变另一个元素的任何内容)

请看这个 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");
});
4

2 回答 2

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,每个测试都会重置和重新解析,因此您从测试内部触发的点击事件是在现在不再在document. 相反,这些元素已被分离并#qunit-fixture从原始 html 文本中重新解析,从而创建新的 DOM 元素。

我已经分叉了你的 jsFiddle 并相应地对其进行了修改:http: //jsfiddle.net/aZRK7/15/

尽管我在注意到之前清理了各个部分,但基本的变化是将元素的查询移动到测试内部:

test('foo', function() {
    var $foo = $('#ele1');
    ok($foo.trigger('click') ....


test('bar', function () {
    var $bar = $('#bar');
    ok($bar.trigger('click') ....
于 2013-05-09T02:07:31.263 回答
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 文档中,查看他们的示例。

于 2013-05-08T20:14:55.940 回答