Nodeunit:测试函数中的运行时/抛出错误是_silent_

Nodeunit: Runtime/thrown errors in test function are _silent_

提问人:Merc 提问时间:11/14/2013 最后编辑:Merc 更新时间:9/1/2014 访问量:908

问:

使用 NodeUnit 的要点之一是编写新函数并经常测试它们。问题是,如果其中一个测试的函数抛出错误(包括 JS 运行时错误),则不会向用户显示该错误。 这是最简单的测试用例:(请注意,a.b.c.d 将导致运行时错误)

exports.all = {
  one: function( test ){
    test.done();
  },

  two: function( test ){
    as( function( err, res ){
      test.done();
    });
  },
}


function as( callback ){
  process.nextTick( function() {
    a = testMe();
    callback( null, a );
  });
}

function testMe(){
  a.b.c.d.e = 100;
  return 10;
}

但是,testMe() 可能是我正在开发的一个新函数。一个未初始化的变量,或者任何东西,都会陷入沉默。

节点 .js mongoDB 单元测试 节点单元

评论


答:

13赞 JohnnyHK 11/18/2013 #1

通过以下事件将您自己的未捕获的异常处理添加到测试文件中:uncaughtException

process.on('uncaughtException', function(err) {
  console.error(err.stack);
});

或者通过创建一个域并添加到其中(或您的测试使用的任何事件发射器),以便您可以捕获在使用以下内容时发生的错误:processprocess.nextTick

var dom = require('domain').create();
dom.add(process);
dom.on('error', function(err) {
    console.error(err.stack);
});

无论哪种方式,你都会获得如下所示的控制台输出:

ReferenceError: a is not defined
    at testMe (/home/test/test.js:24:3)
    at /home/test/test.js:18:9
    at process._tickDomainCallback (node.js:459:13)

评论

0赞 Merc 11/18/2013
我给过某人的最好的 50 分......我想你不想多分享一点关于这个的信息吗?在这一点上,我应该更多地了解错误处理,这对我来说是耻辱。鉴于我还不想触及域,手册说:“当异常冒泡一直回到事件循环时发出。这究竟什么时候会发生?节点实际上做了什么来触发该事件?它是否为每个注册的事件侦听器触发它?我有点困惑!
0赞 Merc 11/18/2013
啊,回答我自己,我明白了。这是当某事,而没有它。因此,实际上存在一个未捕获的错误,该错误“冒泡”。此时,nodejs 会触发进程对象的“uncaughtException”事件。但是,在我上面的代码中,根本没有捕获异常 - 因此冒泡,并且事件在 .我做对了吗?throwscatchprocess
0赞 JohnnyHK 11/18/2013
@Merc很高兴它帮助了你。是的,这就是它的要点。
2赞 Brad 4/13/2015
是的!他们真的应该把它内置到 Nodeunit 中。
0赞 starsinmypockets 8/16/2015
对我来说很奇怪的是,nodeunit 默认情况下不报告未捕获的异常。这里的逻辑是什么?