Nodeunit: Ошибки времени выполнения/генерированные в тестовой функции _silent_

Одним из пунктов использования NodeUnit является написание новых функций и их частое тестирование. Проблема в том, что если одна из протестированных функций выдает ошибку (включая ошибки времени выполнения JS), ошибка не отображается пользователю. Вот простейший возможный тестовый пример: (Обратите внимание, что a.b.c.d вызовет ошибку времени выполнения)

exports.all = {
  one: function( test ){
    test.done();
  },

  two: function( test ){
    as( function( err, res ){
      test.done();
    });
  },
}


function as( callback ){
  process.nextTick( function() {
    a = testMe();
    callback( null, a );
  });
}

function testMe(){
  a.b.c.d.e = 100;
  return 10;
}

Однако testMe() может быть новой функцией, которую я разрабатываю. Неинициализированная переменная или что угодно просто замолчит.


person Merc    schedule 14.11.2013    source источник


Ответы (1)


Добавьте свою собственную обработку неперехваченных исключений в тестовый файл либо через событие uncaughtException:

process.on('uncaughtException', function(err) {
  console.error(err.stack);
});

Или создав домен и добавив к нему process (или любой другой эмиттер событий, который используют ваши тесты), чтобы вы могли отлавливать ошибки, возникающие при использовании process.nextTick:

var dom = require('domain').create();
dom.add(process);
dom.on('error', function(err) {
    console.error(err.stack);
});

В любом случае вы получите вывод консоли, который выглядит так:

ReferenceError: a is not defined
    at testMe (/home/test/test.js:24:3)
    at /home/test/test.js:18:9
    at process._tickDomainCallback (node.js:459:13)
person JohnnyHK    schedule 18.11.2013
comment
Лучшие 50 баллов, которые я когда-либо давал кому-то... Я не думаю, что вы хотели бы рассказать об этом немного больше? Я должен знать больше об обработке ошибок на этом этапе, позор мне. Учитывая, что я пока не хочу касаться доменов, в руководстве сказано: Генерируется, когда исключение всплывает обратно в цикл событий. Когда именно это произойдет? Что на самом деле делает узел, чтобы запустить это событие? он запускает его для каждого когда-либо зарегистрированного прослушивателя событий? Я немного запутался! - person Merc; 18.11.2013
comment
А, отвечая себе, я понял. Это для того, когда что-то throws, а catch для этого нет. Таким образом, фактически возникает неперехваченная ошибка, которая всплывает. В этот момент nodejs запускает событие uncaughtException для объекта процесса. НО, в моем вышеприведенном коде исключение вообще не перехватывается - отсюда всплывание и событие в process. Я правильно понял? - person Merc; 18.11.2013
comment
@Merc Рад, что это помогло тебе. Да, в этом суть. - person JohnnyHK; 18.11.2013
comment
Да! Они действительно должны встроить это в Nodeunit. - person Brad; 13.04.2015
comment
Мне странно, что nodeunit по умолчанию не сообщает о неперехваченных исключениях. Какая здесь логика? - person starsinmypockets; 16.08.2015