我需要测试基于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

因此messageblock4message1而不是message2

我怎么解决这个问题?

最佳答案

简单的答案就是在playerX.send(messageX);之后移动所有playerX.once(),仅此而已。

切记,这些调用是ASYNC,因此顺序并不重要,但是在您触发某些操作之前,您需要准备好接收。

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));
}

07-28 01:23
查看更多