2012-02-21 4 views
4

Я делаю некоторые асинхронные тестирования с nodeunit, и мне было интересно, можно ли указать nodeunit, чтобы не прерывать тестовые примеры до вызова test.done.Можно ли сообщить 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(); 
    }); 
    } 
}); 

Сейчас проблема заключается в том, что ПОНГ не отправляется обратно достаточно быстро для тестирования кода для выполнения. Есть идеи?

+0

Вот что он уже делает. Тест не будет завершен до вызова 'test.done()'. У вас есть синтаксическая ошибка после 'test.done()', хотя это специально? – loganfsmyth

+0

@loganfsmyth на самом деле это не так. Запуск этого узла кода предупредит меня, что у меня есть незавершенные тестовые примеры. Nodeunit фактически завершается, а не ждет test.done(); – disappearedng

+0

Извините, я неправильно понял ваш заголовок, сказав, что он перешел к следующему тесту до того, как первый был сделан, но вы имели в виду, что он вышел, прежде чем тест был закончен. Это две разные вещи. – loganfsmyth

ответ

1

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

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

0

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

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

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

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

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

1

Проблема заключается в том, что nodeunit не является 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

Теоретически это должно работать, но это не так. – DigitalWM

+1

Это работает для меня :-) Убедитесь, что тест не прерывается перед вызовом 'test.done()'. Это может быть вызвано необработанным исключением. – Strix

0

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

/** 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 
    }); 
}; 

 Смежные вопросы

  • Нет связанных вопросов^_^