QUnit没有运行外部JavaScript文件

问题描述:

我试图修改教程here以使用QUnit v2.x,但它似乎没有找到我想测试的JavaScript文件。QUnit没有运行外部JavaScript文件

的test.html

<div id="qunit"></div> 
<div id="qunit-fixture"> 
    <form> 
    <input name="text" /> 
    <div class="has-error">Error text</div> 
    </form> 
</div> 

<script src="http://code.jquery.com/jquery.min.js"></script> 
<script src="qunit.js"></script> 
<script src="../list.js"></script> 
<script> 

    QUnit.test("errors should be hidden on keypress", function (assert) { 
     $('input').trigger('keypress'); 
     assert.equal($('.has-error').is(':visible'), false); 
    }); 

</script> 

list.js

jQuery(document).ready(function ($) { 
    $('input').on('keypress', function() { 
     $('.has-error').hide(); 
    }); 
}); 

试验失败的真正

结果本教程中提供的代码工作正常QUnit 1.23

<script> 

/*global $, test, equal */ 

test("errors should be hidden on keypress", function() { 
    $('input').trigger('keypress'); 
    equal($('.has-error').is(':visible'), false); 
}); 

test("errors not be hidden unless there is a keypress", function() { 
    equal($('.has-error').is(':visible'), true); 
}); 

</script> 

编辑:使用QUnit v1.23这两个版本的测试工作!

+0

你确定你的*的test.html的所有脚本路径*妥善解决?如果测试失败,那么它似乎就像* list.js *中的代码没有运行。 –

+0

将代码放在测试上方的脚本标记中时,它仍然不起作用。我不确定那是否按预期工作。 list.js文件可以在Web Inspector资源中访问。 –

+0

我想你错过了教程中的HTML部分呢?没有你的选择器'.has-error'将不会选择任何东西。 我创建了[这个小提琴](https://jsfiddle.net/vhjparpv/#&togetherjs=PpGJ5xKVrA),两个测试都正常。 –

所以,这个问题已经出现在SO上的multiple other places。基本上发生的事情是QUnit 2以不同的方式处理灯具。您的代码将一个事件处理程序添加到原始HTML中,但随后QUnit杀死该HTML并重建它,从而删除您的处理程序。解决办法是在内部执行绑定的事件,而不是页面加载。这里是a fiddle一起玩,但代码如下:

function init() { 
    $('.username').on('keypress', function() { 
     console.log('hiding error!'); 
     $('.has-error').hide(); 
    }); 
    } 

    QUnit.test("errors should be hidden on keypress", function(assert) { 
    init(); 
    $('.username').trigger('keypress'); 
    assert.strictEqual($('.has-error').is(':visible'), false); 
    }); 

    QUnit.test("errors not be hidden unless there is a keypress", function(assert) { 
    init(); 
    assert.strictEqual($('.has-error').is(':visible'), true); 
    }); 
+1

所以我必须将所有代码包装在QUnit的函数中?这似乎很愚蠢 –

+0

@Peregrinius我乞求不同。您的代码应该设计在可以进行单元和(单元)集成测试的组件中,并彼此独立地进行测试。与只依赖和测试全局状态相比,测试变得更加明确和更易维护。 如果你使用'beforeEach'钩子,上面的代码可能会更好看一些。 –

+0

@Peregrinius你不需要把所有的代码都写在函数中,但是如果你不这样做,那么你就会陷入混乱。除此之外,QUnit通过在每次测试之前重置HTML来做正确的事情。这是HTML设备的行业标准。 – jakerella