Nodeunit Выполнение заказа?
Я пытаюсь протестировать свой веб-сервер с помощью nodeunit:
test.js
exports.basic = testCase({
setUp: function (callback) {
this.ws = new WrappedServer();
this.ws.run(PORT);
callback();
},
tearDown: function (callback) {
delete this.ws;
callback();
},
testFoo: function(test) {
var socket = ioClient.connect(URL);
console.log('before client emit')
socket.emit('INIT', 1, 1);
console.log('after client emit');
}
});
и это мой очень простой сервер nodejs:
WrappedServer.prototype.run = function(port) {
this.server = io.listen(port, {'log level': 2});
this.attachCallbacks();
};
WrappedServer.prototype.attachCallbacks = function() {
var ws = this;
ws.server.sockets.on('connection', function(socket) {
ws.attachDebugToSocket(socket);
console.log('socket attaching INIT');
socket.on('INIT', function(userId, roomId) {
// do something here
});
console.log('socket finished attaching INIT');
});
}
В основном я получаю эту ошибку:
[...cts/lolol/nodejs/testing](testingServer)$ nodeunit ws.js
info - socket.io started
before client emit
after client emit
info - handshake authorized 1013616781193777373
The "sys" module is now called "util". It should have a similar interface.
socket before attaching INIT
socket finished attaching INIT
info - transport end
Так или иначе, сокет испускает INIT ДО того, как сервер присоединит обратные вызовы для сокетов.
Почему это происходит? Кроме того, как правильно это сделать?
1 ответ
Я предполагаю, что вы ожидали, что заказ будет таким?
- гнездо перед подключением INIT
- гнездо закончено присоединение INIT
- до того, как клиент выпустит
- после того, как клиент выпустил
Из-за небольшого количества приведенного кода проблема, вероятно, состоит в двух вещах.
Во-первых, и, вероятно, основная проблема заключается в том, что ваш ioClient.connect не будет подключаться немедленно. Вам нужно передать что-то вроде обратного вызова и выдать INIT
и затем выполните тест callback
функционировать, когда он действительно подключен.
Во-вторых, вы, вероятно, должны сделать то же самое с вами run
команда. listen
прослушивание не будет немедленно прекращено, поэтому вы будете иногда получать противоречивые результаты, если он не начнет слушать к тому моменту, когда он выполнит ваш тест. Вы также должны передать настройки callback
в io.listen
,
Обновить
Быть понятным для listen
Так же, как и большинство вещей в узле, сервер socketio listen
Метод асинхронный. Вызов метода указывает ему начать прослушивание, но в фоновом режиме есть время, когда сервер настраивает сетевые компоненты для начала прослушивания. Так же, как ядро узла listen
, http://nodejs.org/docs/latest/api/net.html, версия socket.io принимает аргумент обратного вызова, который вызывается, когда сервер подключен и прослушивает.
io.listen(port, {'log level': 2}, callback);
Если socket.io не начнет сообщать вам об ошибках соединения, это, вероятно, не является проблемой, но об этом следует помнить. Рассматривать асинхронные действия, как если бы они были мгновенными, - это простой способ сделать ошибки, которые появляются только изредка. Так как ваш run
обертывания слушай, я думаю в общем, не только для тестирования, передачи обратного вызова run
было бы очень хорошей идеей.