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

问题描述 投票:1回答:3

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

我怎么解决这个问题?

node.js unit-testing websocket socket.io mocha
3个回答
0
投票

简单回答就是在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));
}

0
投票

我认为无论执行顺序如何,单元测试都应该通过。据我所知,控制Mocha中测试的执行顺序是不可行的。

而不是这样做,如何设置服务器每单元测试以侦听不同的端口?然后,测试不应相互干扰。

你可以做那个beforeEach and afterEach挂钩。只需在beforeEach中设置一个随机分配端口的服务器,然后在afterEach中关闭服务器。


0
投票

在我这边我使用npm模块mocha-steps,它允许顺序测试。它解决了我们项目中的很多测试问题。

© www.soinside.com 2019 - 2024. All rights reserved.