使用node-inspector调试jasmine-node测试

31

有人知道这是否可能吗?大多数node-inspector示例似乎都是针对调试已调用的网页而设计的。但我想要调试jasmine-node测试。

3个回答

32
简而言之,只需调试jasmine-node:
node --debug-brk node_modules/jasmine-node/lib/jasmine-node/cli.js spec/my_spec.js

如果你查看jasmine-node脚本的源代码,你会发现它只是调用了cli.js,我发现我可以很好地调试那个脚本。
我想使用node-inspector来调试一个CoffeeScript测试。只需添加--coffee开关即可,例如:
node --debug-brk node_modules/jasmine-node/lib/jasmine-node/cli.js --coffee spec/my_spec.coffee

实际上,这似乎运行得很好。加载调试器后,只需按“恢复脚本执行”按钮即可。这将带您到第一个断点。我不确定为什么我的第一个测试退出了。 - Rich Apodaca
1
重要提示:不要指定--autotest命令行选项,因为它会使jasmine-node生成默认情况下无法调试的子进程。如果没有此选项,它将运行正常。 - xorcus
1
如果有帮助的话 - 我认为使用更新后的Node Inspector:node-debug /usr/local/lib/node_modules/jasmine-node/lib/jasmine-node/cli.js spec/ - rob_james
截至我发表评论的日期,以下命令可行:node --inspect --debug-brk -i ./node_modules/jasmine-node/lib/jasmine-node/cli.js test-jasmine/ 正如 @xorcus 所提到的,你不能使用 --autotest。 - Jerinaw

9
我最终编写了一个名为“toggle”的小实用程序:
require('tty').setRawMode(true);
var stdin = process.openStdin();

exports.toggle = function(fireThis)
{
    if (process.argv.indexOf("debug")!=-1)
    {
        console.log("debug flag found, press any key to start or rerun. Press 'ctrl-c' to cancel out!");
        stdin.on('keypress', function (chunk, key) {
            if (key.name == 'c' && key.ctrl == true)
            {
                process.exit();
            }
            fireThis();
        });
    }
    else
    {
        console.log("Running, press any key to rerun or ctrl-c to exit.");
        fireThis();
        stdin.on('keypress', function (chunk, key) {
            if (key.name == 'c' && key.ctrl == true)
            {
                process.exit();
            }
            fireThis();
        });



    }
}

您可以像这样将其放入单元测试中:
var toggle = require('./toggle');

toggle.toggle(function(){

    var vows = require('vows'),
    assert = require('assert');

    vows.describe('Redis Mass Data Storage').addBatch({

....

然后像这样运行您的测试:node --debug myfile.js debug。如果您运行调试切换,它将等待直到您按下除ctrl-c以外的任何键。Ctrl-c退出。您还可以重新运行,这很方便。

w0000t。


4
我的猜测是您需要修补jasmine,我相信当运行测试时,它会生成一个新的node进程或其他什么东西,这些新进程需要启用调试功能。
我有类似的愿望,并成功地使用Eclipse作为调试器使expressso工作: http://groups.google.com/group/nodejs/browse_thread/thread/af35b025eb801f43 但是我意识到:如果我需要跟踪代码以理解它,那么我可能需要重构代码(可能需要更可测试),或将测试拆分成较小的单元。
您的测试就是您的调试器。

显然不是真的。请参考Ian的回答。 - Rich Apodaca
我也认为node-inspector与jasmine-node不兼容,因为jasmine-node会生成子进程,而node-inspector无法处理。寻找解决方案时得到的提示是,对于每个子进程,必须将process.debug_port设置为唯一值,但这需要篡改jasmine-node源代码,我想。 - xorcus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接