尽管我过去曾经使用过QUnit,但距我真正使用它已有一年了,所以我希望这是一件微不足道的事情!

我有很多QUnit测试工作得很好,除了每两次加载页面失败一次。如果刷新,则测试有效,但如果再次刷新,则会中断!它已经可以预见了,但是我不明白为什么它不起作用。有问题的测试应使用trigger('change')事件,但这只会每隔两次触发一次。

我有一个动态填充的select,我绑定了一个change事件。它所做的全部工作将值保存到localStorage,而我刚刚检查过的测试已设置好。

HTML示例:

<select id="options">
    <option value="">Please choose</option>
</select>
<p id="result"></p>


JS示例:

$(document).ready(function() {
    var data = {
        1: 'Option 1',
        2: 'Option 2',
        3: 'Option 3'
    }
    for(var d in data) {
        $('#options').append($('<option>').val(d).text(data[d]));
    }
    $('#options').on('change', function() {
        $('#result').text(this.value);
        if(this.value != '') {
            localStorage.setItem('optionValue') = this.value;
        } else {
            throw 'You must choose a team';
        }
    });
});


QUnit测试示例:

test('Test some other stuff', function(assert) {
    localStorage.removeItem('optionValue');
    // some tests to check things have worked correctly
});

test('Is value added to localStorage?', 2, function(assert) {
    throws(function() { throw new $('#chooseTeam').val('').change(); }, 'No option selected');
    $('#options').val(1).trigger('change');
    equal(localStorage.getItem('optionValue'), 1, 'The first item should be selected');
});


但是,QUnit输出中的结果为undefined。我将其范围缩小到第一次测试,然后能够看到每次都调用的是localStorage.removeItem('optionValue')行,但是更改事件仅每隔两次触发一次。

我创建了一个JS小提琴来尝试演示该问题:http://jsfiddle.net/cchana/zqNtU/3/(演示显示了它应该如何工作,但未通过失败的测试)

是否有任何明显的原因会使它失败?

更新

以为我应该更新一些可能有帮助的信息...

在change方法中,我添加了console.log(),如下所示:

$('#options').on('change', function() {
    console.log('here');
});


我只是想检查一下是否确实触发了更改事件,但是正如测试所示,该方法仅每隔两次触发一次。

更新2

为了使我的测试通过,我删除了不理想的行localStorage.removeItem('optionValue');,如果可能的话,我仍然想深入了解它!

最佳答案

我从this article找到了答案(解决了qunit中交替失败的测试背后的奥秘)

为了解释原因,您可能有一个回调/插件会自动绑定到页面上的现有元素。因此,当包含插件的文件包含在页面中时,元素将自动绑定。

因此,当您第一次运行测试时,它会失败。为什么?!原因是在运行测试时,似乎在每次测试运行时都会重新创建测试工具中的元素。因此,当重新创建它们时,由于已经包含了JavaScript文件,因此不会进行自动绑定。

如果是这样,那么为什么它在备用调用中起作用?啊,魔法就在其中。为了提高测试效率,QUnit将在刷新页面之前先运行失败的测试,然后再运行其他测试。因此,当在其他测试之前执行失败的测试时,已经绑定了测试工具中已存在的元素,因此,测试通过!但是因为现在这些测试通过了,所以刷新页面时,它们将恢复为原来的顺序,因此现在失败了!

当然有了这种认识,它促使我更有效地重写了插件。希望这种自我发现对外面的人有帮助!祝您测试愉快!

我希望这可以帮助你。

关于javascript - 从QUnit调用时,调用trigger()并不总是会触发,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15489182/

10-12 12:59