【问题标题】:QUnit not running external JavaScript fileQUnit 没有运行外部 JavaScript 文件
【发布时间】:2016-07-31 19:10:35
【问题描述】:

我正在尝试修改教程 here 以使用 QUnit v2.x,但它似乎没有获取我想要测试的 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 两个版本的测试都可以工作!

【问题讨论】:

  • 您确定您的 test.html 中的所有脚本路径都能正确解析吗?如果测试失败,那么似乎 list.js 中的代码没有运行。
  • 将代码放在测试上方的脚本标签中时,它仍然无法工作。我不确定这是否按预期工作。可以在 Web Inspector 资源中访问 list.js 文件。
  • 我猜你错过了教程中的 HTML 部分?否则,您的选择器 .has-error 将不会选择任何内容。我创建了this fiddle,两个测试都运行良好。
  • @Daniel - 我最初只是从问题中排除了 HTML 部分。我现在已经添加了。您的小提琴正在测试错误版本的 QUnit。你有 1.x 测试,我质疑 2.x 测试不起作用。

标签: javascript jquery unit-testing qunit


【解决方案1】:

所以,这个问题已经在 SO 上的 multiple other places 中提出。基本上发生的事情是 QUnit 2 以不同的方式处理固定装置。您的代码向原始 HTML 添加了一个事件处理程序,但随后 QUnit 会终止该 HTML 并重新构建它,从而删除您的处理程序。解决方案是在您的测试中进行事件绑定inside,而不是在页面加载时。这里是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);
  });

【讨论】:

  • 所以我必须将所有代码包装在 QUnit 的函数中?这似乎很愚蠢
  • @Peregrinius 我不敢苟同。您的代码应该设计在可以相互独立进行单元和(单元)集成测试的组件中。与仅仅依赖和测试全局状态相比,测试变得更加明确和可维护。如果你使用 beforeEach 钩子,上面的代码可能看起来会更好。
  • @Peregrinius 您没有必须在函数中编写所有代码,但如果您不这样做,那么您将把自己弄得一团糟。除此之外,QUnit 通过在每次测试之前重置 HTML 来做正确的事情。这是 HTML 固定装置的行业标准。
猜你喜欢
  • 1970-01-01
  • 2021-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多