运行 QUnit 测试时静态选定变量丢失

Static selected variables are lost while running QUnit tests

我刚开始使用 QUnit,运行 遇到了问题。

当我编写 JavaScript 文件时,我将所有变量放在页面顶部,如下所示:

var $input1 = $('#input1');
var $submit = $('#submit');

然后,我像这样安排我的活动:

$submit.on('click', function (e) {
    submit(e);
});

这很好用,而且是一个很好的方法,让我不必在每次需要某些东西时都继续浏览并找到所有元素。 (不要到处乱扔代码 $('#submit')。)

但是,现在我正在 运行使用 QUnit 进行测试,每次新测试 运行 时 qunit-fixture div 中的项目都会被替换. (我正在重写一些别人做过的代码,所以有一些初始的现有测试。)

截至目前,其他人编写的测试将一些静态 HTML 附加到模块 beforeEach 中的 qunit-fixture div。

最后一点重要的说明,这是 ASP.NET MVC 项目的一部分,我们 运行 正在使用 chutzpah 进行测试,因此我们没有明确 HTML 页到 运行 每个测试文件。我们的目的是在命令行中 运行 它们,尤其是作为构建过程的一部分。

当我们没有为它们构建完整的 HTML 页面时,如何让那些应该始终在页面上的静态项目保持原样?

编辑 我对此做了更多研究,因为我在测试文件中将 HTML 添加到 DOM,当我 select 顶部的变量时,那些元素不在我正在测试的文件中的页面上。

好吧,事实证明是 Chutzpah 出了问题。他们用来测试的 HTML 绝对是可怕的。所有脚本都在 <head> 标签中,因此它们总是在任何 HTML 添加到 DOM 之前被处理。解决这个问题的方法是使用 Customizable Test Harness

不幸的是,他们的文档没有提供有关如何实际制作此文档的任何信息。他们列出了您需要包含的项目以供他们替换,但是(与所有 JavaScript 文件一样)他们的顺序非常重要,不一定按照他们列出的顺序。这是我使用的,和效果很好。

<html>
    <head>
        <title>Chutzpah tests</title>

        @@ReferencedCSSFiles@@
    </head>
    <body>
        <h1 id="qunit-header">Unit Tests</h1>
        <h2 id="qunit-banner"></h2>
        <h2 id="qunit-userAgent"></h2>
        <ol id="qunit-tests"></ol>
        <div id="qunit-fixture">test markup, will be hidden</div>

        @@TestFrameworkDependencies@@
        @@CodeCoverageDependencies@@
        @@TestHtmlTemplateFiles@@

        @@ReferencedJSFiles@@

        @@TestJSFile@@

        @@AMDTestPath@@
        @@AMDModuleMap@@
    </body>
</html>

这样,您就可以向文件中添加任何静态 HTML。但是,有一些注意事项:

  • qunit-fixturediv必须与其他 QUnit 元素处于同一级别。
  • qunit-fixturediv必须紧跟qunit-testsdiv.

但是,通过在页面底部包含所有 CSS,它的行为就像您对任何 HTML 页面所期望的那样,您可以自己编写它们所在的页面相同的位置。

此外,您还需要将以下信息添加到您的 chutzpah.json 文件中:

"CustomTestHarnessPath": "CustomTestHarness.html",
"TestHarnessLocationMode": "SettingsFileAdjacent",
"Tests": [
    { "Includes": ["*.js"]}
]

如果您将 HTML 页面放在与 chutzpah.js 和测试相同的位置,您还需要添加 Tests 过滤器,以便 HTML 页面不会被尝试 运行 作为测试。