Nodeunit Выполнение заказа? - PullRequest
0 голосов
/ 21 февраля 2012

Я пытаюсь протестировать мой веб-сервер с помощью 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 Ответ

0 голосов
/ 21 февраля 2012

Я предполагаю, что вы ожидали, что заказ будет таким?

  • гнездо перед подключением INIT
  • гнездо закончено присоединение INIT
  • до того, как клиент выпустит
  • после того, как клиент испустит

Из-за небольшого количества приведенного кода проблема, вероятно, состоит в двух вещах.

Во-первых, и, возможно, основная проблема заключается в том, что ваш ioClient.connect не будет подключаться немедленно. Вам нужно передать какой-то обратный вызов и выдать INIT, а затем выполнить функцию callback теста, как только он действительно подключится.

Во-вторых, вы, вероятно, должны сделать то же самое с вашей командой run. listen не остановит прослушивание сразу, поэтому вы будете время от времени получать противоречивые результаты, если он не начнет слушать к тому времени, когда выполнит ваш тест. Вы также должны передать набор callback в io.listen.

Обновление

Для ясности listen, как и большинство вещей в узле, метод listen сервера socketio является асинхронным. Вызов метода указывает ему начать прослушивание, но в фоновом режиме есть время, когда сервер настраивает сетевые компоненты для начала прослушивания. Так же, как ядро ​​узла listen, версия http://nodejs.org/docs/latest/api/net.html#server.listen, socket.io принимает аргумент обратного вызова, который вызывается, когда сервер подключен и прослушивает.

io.listen(port, {'log level': 2}, callback);

Если socket.io не начнет сообщать об ошибках при невозможности подключения, это, вероятно, не проблема, но об этом следует помнить. Рассматривать асинхронные действия, как если бы они были мгновенными, - это простой способ делать ошибки, которые появляются только изредка. Поскольку ваши run обертывания слушают, я думаю, что в целом, не только для тестирования, передача обратного вызова на run была бы очень хорошей идеей.

...