【问题标题】:Nodeunit: Runtime/thrown errors in test function are _silent_Nodeunit:测试函数中的运行时/抛出错误是_silent_
【发布时间】:2014-09-01 01:17:23
【问题描述】:

使用 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() 可能是我正在开发的一个新函数。一个未初始化的变量,或任何东西,将保持沉默。

【问题讨论】:

    标签: node.js mongodb unit-testing nodeunit


    【解决方案1】:

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

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

    或者通过创建一个域并将process 添加到它(或您的测试使用的任何事件发射器),以便您可以捕获在使用process.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)
    

    【讨论】:

    • 我给某人的最好的 50 分...我想您不想再分享一点吗?在这一点上,我应该了解更多关于错误处理的信息,真可惜。鉴于我还不想接触域,手册说:“当异常冒泡回到事件循环时发出。”那具体什么时候会发生呢?节点实际上做什么 来触发该事件?它会为每个注册的事件侦听器触发它吗?我有点困惑!
    • 啊,回答我自己,我明白了。这是用于 throws 的时候,而没有 catch 的时候。因此,实际上存在一个未捕获的错误,它“冒泡”。那时,nodejs 为进程对象触发“uncaughtException”事件。但是,在我上面的代码中,这个异常根本没有被捕获——因此冒泡了,事件在process。我做对了吗?
    • @Merc 很高兴它帮助了你。是的,这就是它的要点。
    • 是的!他们真的应该将它构建到 Nodeunit 中。
    • 默认情况下 nodeunit 不报告未捕获的异常对我来说很奇怪。这里的逻辑是什么?
    猜你喜欢
    • 1970-01-01
    • 2015-04-25
    • 2020-01-25
    • 1970-01-01
    • 2016-08-08
    • 2012-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多