Является ли assert.throws узла полностью сломанным? - PullRequest
32 голосов
/ 11 июля 2011

Учитывая этот код:

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 );

Это не удастся. Что я делаю не так или какой секрет знают все, кроме меня?

Ответы [ 4 ]

63 голосов
/ 11 июля 2011

В примерах используется функция, в то время как ваш пример кода вызывает функцию и передает результат. Исключение происходит еще до того, как объект assert сможет его увидеть.

Измените свой код на это:

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 );
9 голосов
/ 07 июля 2015

Вы можете использовать bind ():

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

С аргументами это:

assert.throws( boom.bind(null, "This is a blowup"), Error );
7 голосов
/ 20 сентября 2015

Текущий стабильный узел (v4.1) включает поддержку жирной стрелки по умолчанию (флаг --harmony не требуется), поэтому вы можете сделать что-то вроде:

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

Даже если у вас есть скобки после boom() (таким образом, вы фактически вызываете его, вместо передачи ссылки на объект функции), используя функцию жирной стрелки, вы оборачиваете ее в блок, чего и ожидает assert.throws.

0 голосов
/ 16 апреля 2017

Это тесно связано с проблемой людей с другим утверждением мокко / чай. См. Этот ответ для описания с node примерами:
Мокко / Чай ожидают. К броску не ловит брошенные ошибки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...