节点的assert.throws完全破坏?

鉴于此代码:

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

我得到这个输出,节点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) 

对我而言,这意味着发生了一个未捕获的exception,而不是一个被报道的exception。 查看文档,我注意到这些例子看起来更像这样:

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

但是,如果在给定input的情况下抛出exception,你怎么testing呢? 例如:

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

这将失败。 我做错了什么,或者除了我之外,每个人都知道什么秘密?

这些示例使用一个函数,而示例代码调用一个函数并传递结果。 exception发生之前断言甚至看看它。

将您的代码更改为:

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

编辑:要传递参数,只是使另一个function。 毕竟,这是JavaScript!

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

你可以使用bind():

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

有了论点,它是:

 assert.throws( boom.bind(null, "This is a blowup"), Error ); 

当前节点稳定(v4.1)默认包括胖箭头function支持(不需要--harmony标志),所以你可以这样做:

 assert.throws(()=>boom(), Error); assert.throws(()=>boom(true), Error); // with params 

即使在boom()之后有括号(所以你实际调用它,而不是传递一个函数对象的引用),通过使用胖箭头函数,你将它包装在一个块中,这就是assert.throws预计。

这与人们与其他主张摩卡/柴的问题密切相关。 有关node示例的描述,请参阅此答案:
摩卡/柴期望不会抛出抛出的错误