Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Nodeunit: Runtime/thrown errors in test function are _silent_

One of the points of using NodeUnit is to write new functions and test them often. Problem is, if one of the tested functions throws an error (including JS runtime errors), the error is not shown to the user. Here is the simplest possible test case: (Note that a.b.c.d will cause a runtime error)

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;
}

However, testMe() might be a new function I am developing. An uninitialised variable, or anything, will just fall silent.

like image 288
Merc Avatar asked Nov 14 '13 07:11

Merc


1 Answers

Add your own uncaught exception handling to your test file either via the uncaughtException event:

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

Or by creating a domain and adding process to it (or whatever event emitter(s) your tests use) so that you can catch the errors that occur within your use of process.nextTick:

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

Either way, you'll then get console output that looks like:

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)
like image 199
JohnnyHK Avatar answered Nov 05 '22 12:11

JohnnyHK