0

nodeunit を使用して Web サーバーをテストしようとしています。

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 を発行します。

なぜこうなった?さらに、これを行う正しい方法は何ですか?

4

1 に答える 1

0

順番がこうなることを予想していたのだろうか?

  • INITを付ける前のソケット
  • ソケット付け済み INIT
  • クライアントが発行する前に
  • クライアントが発行した後

与えられた少量のコードから、問題はおそらく 2 つのことです。

まず、おそらく主な問題は、ioClient.connect がすぐに接続されないことです。それにある種のコールバックを渡し、 を発行し、実際に接続したらINITテストの関数を実行する必要があります。callback

次に、コマンドで同じことを行う必要がありますrunlistenすぐにリッスンを開始しないため、テストを実行するまでにリッスンを開始していない場合、一貫性のない結果が得られることがあります。また、setUp を に渡す必要がありcallbackますio.listen

アップデート

明確にするためlistenに、node のほとんどのものと同様に、socketio サーバーのlistenメソッドは非同期です。メソッドを呼び出すとリッスンを開始するように指示されますが、バックグラウンドでサーバーがネットワークをセットアップしてリッスンを開始する時間があります。node の core listenhttp://nodejs.org/docs/latest/api/net.html#server.listenと同様に、socket.io のバージョンは、サーバーが起動してリッスンすると呼び出されるコールバック引数を取ります。

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

socket.io が接続の失敗に関するエラーを表示し始めない限り、これはおそらく問題ではありませんが、覚えておく必要があります。非同期アクションをあたかも瞬間的であるかのように扱うことは、たまにしか発生しないバグを簡単に作成する方法です。あなたのrunラップはリッスンしているので、テストのためだけでなく、コールバックを渡すrunことは非常に良い考えです。

于 2012-02-21T00:44:17.433 に答える