节点的断言是否完全断开?

And*_*rew 33 unit-testing node.js

鉴于此代码:

var assert = require('assert');

function boom(){
    throw new Error('BOOM');
}

assert.throws( boom(), Error );
Run Code Online (Sandbox Code Playgroud)

我得到这个输出,节点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)
Run Code Online (Sandbox Code Playgroud)

对我来说,这意味着发生了未捕获的异常,而不是报告的异常.查看文档,我注意到示例看起来更像是这样的:

var assert = require('assert');

function boom(){
    throw new Error('BOOM');
}

assert.throws( boom, Error );
Run Code Online (Sandbox Code Playgroud)

但是,如果给出一定的输入,你如何测试它是否会抛出异常?例如:

var assert = require('assert');

function boom(blowup){
    if(blowup)
        throw new Error('BOOM');
}

assert.throws( boom, Error );
Run Code Online (Sandbox Code Playgroud)

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

Mik*_*ron 64

这些示例采用函数,而示例代码调用函数并传递结果.异常发生在断言甚至查看它之前.

将您的代码更改为:

var assert = require('assert');

function boom(){
    throw new Error('BOOM');
}

assert.throws( boom, Error ); // note no parentheses
Run Code Online (Sandbox Code Playgroud)

编辑:要传递参数,只需创建另一个函数.毕竟,这是javascript!

var assert = require('assert');

function boom(blowup){
    if(blowup)
        throw new Error('BOOM');
}

assert.throws( function() { boom(true); }, Error );
Run Code Online (Sandbox Code Playgroud)


Kie*_*lus 9

你可以使用bind():

assert.throws( boom.bind(null), Error );
Run Code Online (Sandbox Code Playgroud)

有了参数,它是:

assert.throws( boom.bind(null, "This is a blowup"), Error );
Run Code Online (Sandbox Code Playgroud)


Mih*_*aru 7

当前节点稳定(v4.1)默认包含胖箭头功能支持(无需--harmony标记),因此您可以执行以下操作:

assert.throws(()=>boom(), Error);
assert.throws(()=>boom(true), Error); // with params
Run Code Online (Sandbox Code Playgroud)

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