0

我正在尝试使用 nodeunit 测试我的 Web 服务器:

测试.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。

为什么会这样?另外,这样做的正确方法是什么?

4

1 回答 1

0

我假设您希望订单是这样的?

  • 附加 INIT 之前的套接字
  • 套接字完成附加 INIT
  • 在客户端发出之前
  • 客户端发出后

从给出的少量代码来看,问题可能是两件事。

首先,也可能是主要问题,您的 ioClient.connect 不会立即连接。您需要将某种回调传递给它,然后发出INIT,然后在callback实际连接后执行测试的功能。

其次,你可能应该对你的run命令做同样的事情。listen不会立即开始收听,所以如果它在执行测试时还没有开始收听,你偶尔会得到不一致的结果。您还应该将 setUp 传递callbackio.listen.

更新

需要明确的是listen,就像 node 中的大多数东西一样,socketio 服务器的listen方法是异步的。调用该方法会告诉它开始侦听,但在后台有一段时间服务器设置网络内容以开始侦听。就像 node 的核心http://nodejs.org/docs/latest/api/net.html#server.listenlisten一样,socket.io 的版本采用一个回调参数,一旦服务器启动并监听,就会调用该参数。

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

除非 socket.io 开始给你连接失败的错误,这可能不是问题,但要记住这一点。将异步操作视为瞬时操作是一种容易产生仅偶尔出现的错误的方法。由于您的run包裹听,我认为一般来说,不仅仅是为了测试,将回调传递给run将是一个非常好的主意。

于 2012-02-21T00:44:17.433 回答