鉴于此代码:
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)
对我而言,这意味着发生了未捕获的异常,而不是报告的异常。查看文档,我注意到示例看起来更像是这样:
var assert = require('assert');
function boom(){
throw new Error('BOOM');
}
assert.throws( boom, Error );
但是如何测试它是否会在给定输入的情况下抛出异常?例如:
var assert = require('assert');
function boom(blowup){
if(blowup)
throw new Error('BOOM');
}
assert.throws( boom, Error );
这会失败。我做错了什么,或者除了我之外每个人都知道什么秘密?
答案 0 :(得分:62)
示例采用函数,而示例代码调用函数并传递结果。异常发生在断言甚至查看它之前。
将您的代码更改为:
var assert = require('assert');
function boom(){
throw new Error('BOOM');
}
assert.throws( boom, Error ); // note no parentheses
编辑:要传递参数,只需创建另一个函数。毕竟,这是javascript!
var assert = require('assert');
function boom(blowup){
if(blowup)
throw new Error('BOOM');
}
assert.throws( function() { boom(true); }, Error );
答案 1 :(得分:9)
您可以使用bind():
assert.throws( boom.bind(null), Error );
参数是:
assert.throws( boom.bind(null, "This is a blowup"), Error );
答案 2 :(得分:6)
当前节点稳定(v4.1)默认包含胖箭头功能支持(无需--harmony
标志),因此您可以执行以下操作:
assert.throws(()=>boom(), Error);
assert.throws(()=>boom(true), Error); // with params
即使你在boom()
之后有括号(所以你实际上正在调用它,而不是传递对函数对象的引用),通过使用胖箭头函数,你将它包装在一个块,这是assert.throws
所期望的。
答案 3 :(得分:0)
这与人们与其他断言Mocha / Chai的问题密切相关。有关node
示例的说明,请参阅此答案:
Mocha / Chai expect.to.throw not catching thrown errors