【问题标题】:Uncaught exception with qunit and jqueryqunit 和 jquery 未捕获的异常
【发布时间】:2013-04-23 02:00:05
【问题描述】:

我在尝试使用 qunit 让 javascript 单元测试在命令行中工作时遇到问题。

这里有一些重现错误的示例代码:

文件util.js

function abc() {
    return 'abc';
}

if (typeof module !== 'undefined' && module.exports) {
    module.exports = {
        abc: abc
    };
}

文件 util-tests.js

var qunit = require("qunit");

test("Test abc function", function () {
         equal(util.abc(), 'abc');
});

使用这些文件,我可以使用以下命令运行测试(在 shell 中提供类似表格的输出以及测试结果):

qunit -c util:util.js -t util-tests.js

现在,如果我将以下内容添加到 util.js,它会中断

$(document).ready(function () {
    /* some code here */
});

这是错误输出:

qunit -c util:util.js -t util-tests.js

Testing /home/mfrere/jstst/util.js ... [Error: Uncaught exception in child process.]

同样的问题:

var a = $;

或:

var a = document;

所以这让我觉得我需要以某种方式导入 jQuery,所以我考虑将 jquery.js 作为依赖项添加到命令中,如下所示:

qunit -c util:util.js -t util-tests.js -d jquery.js

即使 util.js 不包含对“$”的任何引用,上面的命令也会给我同样的“未捕获异常”错误。

我可能还需要做一些其他事情来让 qunit 识别“文档”,但我不知道是什么或如何。

现在我的问题是:我应该怎么做才能让它工作?重要的是要记住我想在命令行中测试我的文件,而不是在浏览器中。 p>

以防万一我在设置过程中做错了,这就是我安装 node/qunit 的方式(在 ubuntu 下):

git clone git://github.com/creationix/nvm.git ~/.nvm

在 .bashrc 中,我添加了以下行:

source ~/.nvm/nvm.sh

选择了特定版本的节点

nvm install v0.9.2
nvm alias default 0.9

并安装了 qunit

npm install -g qunit

最后我不得不在 .bashrc 中添加这个:

export NODE_PATH=~/.nvm/v0.9.2/lib/node_modules

【问题讨论】:

    标签: javascript jquery node.js unit-testing qunit


    【解决方案1】:

    你还没有导入 jQuery:

    $ = require('jquery'), jQuery = require('jquery');

    如果您使用的是 browserify,请将其更改为“jquery-browserify”。

    【讨论】:

    • 好的,这就是我所做的:npm install -g jquery 在命令行然后我尝试将您的代码添加到测试代码中但没有成功(仍然未捕获错误......)。但是,如果我将$ = require('jquery') 添加到生产代码中并避免使用$(document).ready() 而使用$(function () {});,我的测试确实有效。但是我不能将此解决方案用作 1)它修改了生产代码。 2)它在生产代码中重新定义了$。我尝试在单独的文件中写入该行并使用“-d”选项添加它,但再次出现“未捕获的错误”
    • util.js 中是否有要求声明?在您引用 $ 的任何地方都需要它。
    • 是的,Eric,这就是我所说的生产代码。我不能这样做,因为 $ 会被我使用 npm (jQuery 1.8.3) 获得的 jquery 包重新分配,而不是我在生产服务器上安装的包 (jQuery 1.9.1)。此外,我不喜欢将任何与测试相关的代码添加到生产代码中。不过,感谢您的初步回答,它帮助我更好地理解了这个问题。如果在接下来的几天里没有答案,我可能不得不切换到基于浏览器的测试。我宁愿不这样做,但似乎它可以让我更好地控制测试本身。
    • 我认为切换到基于浏览器的测试实际上是一个非常好的主意。我使用grunt-saucelabs grunt 任务在真实的浏览器中测试我所有的浏览器代码(实际上是一次很多)。请参阅 GruntSauceLabs。奖励 - 您可以在浏览器环境中看到浏览器测试通过(或失败)的录制视频,甚至可以测试移动浏览器。 Node 很棒,但不是万能的。
    • 我会接受这个答案,因为没有人能给我更好的答案。谢谢埃里克。
    猜你喜欢
    • 2010-11-08
    • 1970-01-01
    • 2010-09-28
    • 2012-05-31
    相关资源
    最近更新 更多