Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Node assert.throws not catching exception

Given this code:

var assert = require('assert');  function boom(){     throw new Error('BOOM'); }  assert.throws( boom(), Error ); 

I get this output, with node 0.4.9:

node.js:134         throw e; // process.nextTick error, or 'error' event on first tick         ^ Error: BOOM     at boom ([EDITED]/assert.throws.test.js:4:9)     at Object.<anonymous> ([EDITED]/assert.throws.test.js:7:17)     at Module._compile (module.js:402:26)     at Object..js (module.js:408:10)     at Module.load (module.js:334:31)     at Function._load (module.js:293:12)     at Array.<anonymous> (module.js:421:10)     at EventEmitter._tickCallback (node.js:126:26) 

This, to me, implies that an uncaught exception has occurred, as opposed to a reported, caught exception. Looking in the docs, I notice that the examples look more like this:

var assert = require('assert');  function boom(){     throw new Error('BOOM'); }  assert.throws( boom, Error ); 

But how do you test if it throws an exception given a certain input? For example:

var assert = require('assert');  function boom(blowup){     if(blowup)         throw new Error('BOOM'); }  assert.throws( boom, Error ); 

This will fail. What am I doing wrong, or what secret does everybody know but me?

like image 957
Andrew Avatar asked Jul 11 '11 03:07

Andrew


People also ask

Does assert throw an exception JavaScript?

The assert. throws() is used when the code throws an exception based on a specific circumstances, to catch the error object for testing and comparison.

What is assertion error in node JS?

As with many other programming languages, Node. js comes with an assert class as part of its core modules set, allowing simple assertion tests to be performed. When such an assertion fails an AssertionError is thrown to indicate what went wrong.


2 Answers

The examples take a function, while your sample code calls a function and passes the result. The exception happens before the assert even gets to look at it.

Change your code to this:

var assert = require('assert');  function boom(){     throw new Error('BOOM'); }  assert.throws( boom, Error ); // note no parentheses 

EDIT: To pass parameters, just make another function. After all, this is javascript!

var assert = require('assert');  function boom(blowup){     if(blowup)         throw new Error('BOOM'); }  assert.throws( function() { boom(true); }, Error ); 
like image 169
Mike Caron Avatar answered Sep 19 '22 06:09

Mike Caron


You can use bind():

assert.throws( boom.bind(null), Error ); 

With arguments it is:

assert.throws( boom.bind(null, "This is a blowup"), Error ); 
like image 36
Kiechlus Avatar answered Sep 20 '22 06:09

Kiechlus