Является ли node assert.throws полностью нарушенным?
С учетом этого кода:
var assert = require('assert');
function boom(){
throw new Error('BOOM');
}
assert.throws( boom(), Error );
Я получаю этот вывод с 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)
Это, для меня, подразумевает, что произошло неперехваченное исключение, в отличие от сообщенного исключенного catch. В документах я замечаю, что примеры выглядят примерно так:
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 );
Это не удастся. Что я делаю неправильно, или какой секрет все знают, кроме меня?
Ответы
Ответ 1
В примерах используется функция, а ваш пример кода вызывает функцию и передает результат. Исключение происходит до того, как assert даже начнет смотреть на него.
Измените код следующим образом:
var assert = require('assert');
function boom(){
throw new Error('BOOM');
}
assert.throws( boom, Error ); // note no parentheses
EDIT: для передачи параметров просто выполните другую функцию. В конце концов, это javascript!
var assert = require('assert');
function boom(blowup){
if(blowup)
throw new Error('BOOM');
}
assert.throws( function() { boom(true); }, Error );
Ответ 2
Вы можете использовать bind():
assert.throws( boom.bind(null), Error );
С аргументами это:
assert.throws( boom.bind(null, "This is a blowup"), Error );
Ответ 3
Текущая node стабильная (v4.1) включает поддержку функции поддержки стрелок по умолчанию (не требуется флаг --harmony
), поэтому вы можете сделать что-то вроде:
assert.throws(()=>boom(), Error);
assert.throws(()=>boom(true), Error); // with params
Даже если у вас есть круглые скобки после boom()
(так что вы на самом деле вызываете его, вместо передачи ссылки на объект функции), используя функцию толстой стрелки, вы обертываете ее в блок, что и есть assert.throws
ожидает.
Ответ 4
Это тесно связано с проблемой людей с другим утверждением Mocha/Chai. См. Этот ответ для описания с примерами node
:
Mocha/Chai ожидает, что не поймает заброшенных ошибок