如何使用mocha测试node.js websocket服务器?

如何使用mocha测试node.js websocket服务器?,node.js,unit-testing,websocket,socket.io,mocha.js,Node.js,Unit Testing,Websocket,Socket.io,Mocha.js,我需要测试一个基于websocket的扑克游戏服务器 所以,若player1向服务器发送消息,服务器通常应该向其他玩家发送消息 我编写了一个测试块,如下所示: describe('protocol', () => { before(() => { player1 = new WebSocket('ws://xxxxxx'); player1 = new WebSocket('ws://xxxxxx'); player2 = new WebSocket('w

我需要测试一个基于websocket的扑克游戏服务器

所以,若
player1
向服务器发送消息,服务器通常应该向其他玩家发送消息

我编写了一个测试块,如下所示:

describe('protocol', () => {
  before(() => {
    player1 = new WebSocket('ws://xxxxxx');
    player1 = new WebSocket('ws://xxxxxx');
    player2 = new WebSocket('ws://xxxxxx');
    player3 = new WebSocket('ws://xxxxxx');
  });

  it('player1 send message1 player3 should receive' (done) => {

    //block1
    let message1 = {
      id: 'message1',
      data: 'message1'
    };

    player1.send(JSON.stringify(message1));
    player3.once('message', (message) => {

      //block2
      expect(message).equal(JSON.stringify(message1)),
      done();
    });
  });

  it('player2 send message2 player3 should also receive' (done) => {

    //block3
    let message2 = {
      id: 'message2',
      data: 'message2'
    };

    player2.send(JSON.stringify(message1));
    player3.once('message', (message) => {

      //block4
      expect(message).equal(JSON.stringify(message2)),
      done();
    });
  });
}
我想要的执行顺序是:
block1
->
block2
->
block3
->
block4

但是真正的:
blocks1
->
block3
->
block2
->
block4

因此
block4
message
message1
而不是
message2


我怎样才能解决这个问题呢?

简单的回答就是移动所有的
playerX.send(messageX)
playerX.once()之后(
),就是这样

请记住,这些调用是异步的,所以顺序并不重要,但您需要在启动某些东西之前做好接收准备

describe('protocol', () => {
  before(() => {
    player1 = new WebSocket('ws://xxxxxx');
    player1 = new WebSocket('ws://xxxxxx');
    player2 = new WebSocket('ws://xxxxxx');
    player3 = new WebSocket('ws://xxxxxx');
  });

  it('player1 send message1 player3 should receive', (done) => {

    //block1
    let message1 = {
      id: 'message1',
      data: 'message1'
    };

    player3.once('message', (message) => {

      //block2
      expect(message).equal(JSON.stringify(message1));
      done();
    });
    player1.send(JSON.stringify(message1));
  });

  it('player2 send message2 player3 should also receive', (done) => {

    //block3
    let message2 = {
      id: 'message2',
      data: 'message2'
    };

    player3.once('message', (message) => {

      //block4
      expect(message).equal(JSON.stringify(message2));
      done();
    });
  });
  player2.send(JSON.stringify(message1));
}

我认为不管执行顺序如何,单元测试都应该通过。据我所知,在摩卡控制测试的执行顺序是不可行的

与其这样做,不如将服务器每单元测试设置为侦听不同的端口?然后,测试不应该相互干扰


你可以这样做。只需在每次之前设置一个随机分配端口的服务器,然后在每次之后关闭服务器。

在我这方面,我使用npm模块mocha步骤,允许顺序测试。它解决了我们项目中的许多测试问题。

但它并不有效,
之前
之后
没有影响。因为
playerX.send(messageX)
playerX。一旦('xxx',listener)
被同步调用,listener总是在这些之后调用。对不起,我错了。我的代码是正确的,问题来自其他地方。对不起!!!!此代码块的执行顺序为
block1
->
block2
->
block3
->
block4