Можно ли сказать, что nodeunit не должен завершать определенный тест, пока не будет вызван test.done ()? - PullRequest
4 голосов
/ 21 февраля 2012

Я выполняю некоторое асинхронное тестирование с помощью nodeunit, и мне было интересно, можно ли сказать, что nodeunit не завершает тестовые случаи до тех пор, пока не будет вызван test.done.

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

exports.basic = testCase({

  setUp: function (callback) {
    this.ws = new WrappedServer();
    this.ws.run(PORT);
    callback();
  },

  tearDown: function (callback) {
    callback();
  },

  testFoo: function(test) { 
    var socket = ioClient.connect(URL);
    socket.emit('PING', 1, 1);
    socket.on('PONG', function() { 
      // do some assertion of course
      test.done();
    }); 
  }
});

Проблема сейчас в том, что PONG не отправляется обратно достаточно быстро для выполнения тестового кода.Есть идеи?

Ответы [ 4 ]

1 голос
/ 05 сентября 2013

Проблема в том, что узел узла не expect не делает никаких утверждений, поэтому он не ждет их и немедленно завершает работу.Подсчитайте свои утверждения и позвоните test.expect() в начале теста.

exports.example = function(test) {
    // If you delete next line, the test will terminate immediately with failure.
    test.expect(1);

    setTimeout(function(){
        test.ok(true);
        test.done();
    }, 5000);       
};
1 голос
/ 24 июля 2014

У меня просто была очень похожая проблема, поэтому я просматривал этот вопрос.В моем случае сервер (аналог вашего WrappedServer) выдавал исключение, вызывая внезапное завершение теста, не обращаясь к моему обработчику событий с помощью test.done ().Я думаю, что это довольно грубо из узла узла, чтобы проглотить исключение без писка.

Мне пришлось прибегнуть к отладчику, чтобы найти проблему, которая, если вы еще не сделали раньше, я могу спасти вас веб-поиска: node --debug-brk node_modules / nodeunit / bin / nodeunit your_nodeunit_test.js

0 голосов
/ 29 мая 2015

Вы, вероятно, хотите что-то вроде:

/** Invoke a child function safely and prevent nodeunit from swallowing errors */
var safe = function(test, x) {
  try { x(test); } catch(ex) {
    console.log(ex);
    console.log(ex.stack);
    test.ok(false, 'Error invoking async code');
    test.done();
  }
};

exports.testSomething = function(test){
  test.expect(1); // Prevent early exit
  safe(test, function(test) {
    // ... some async code here
  });
};
0 голосов
/ 21 февраля 2012

Когда узел узла говорит «Отменить тесты», это означает, что процесс узла вышел без завершения всех тестов. Чтобы было ясно, это не означает, что «PONG не отправляется обратно достаточно быстро», это означает, что в цикле обработки событий больше не было обработчиков. Если обработчиков больше нет, событие PONG некуда взять, поэтому тест не может быть продолжен.

Например, если вы запустили что-то вроде этого:

var s = require('http').createServer();
s.listen(80)

Когда вы запускаете listen, сервер начинает прослушивать входящие данные и добавляется в цикл обработки событий для проверки входящих соединений. Если вы только создали createServer, никакие события не сработают, и ваша программа просто закроется.

У вас есть что-нибудь, связанное с событием error, где могут быть ошибки, которые не отображаются?

...