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 开发者_C百科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?
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 );
You can use bind():
assert.throws( boom.bind(null), Error );
With arguments it is:
assert.throws( boom.bind(null, "This is a blowup"), Error );
Current node stable (v4.1) includes fat arrow function support by default (no --harmony
flag required) so you can do something like:
assert.throws(()=>boom(), Error);
assert.throws(()=>boom(true), Error); // with params
Even if you have parentheses after boom()
(so you're actually invoking it, instead of passing a reference to the function object), by using the fat arrow function you're wrapping it in a block, which is what assert.throws
expects.
This is closely related to the issue people with with other assertion Mocha/Chai. See this answer for the description with node
examples:
Mocha / Chai expect.to.throw not catching thrown errors
精彩评论