【问题标题】:How to test node.js websocket server with mocha?如何使用 mocha 测试 node.js websocket 服务器?
【发布时间】:2016-04-19 02:41:22
【问题描述】:

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

所以block4messagemessage1 而不是message2

我该如何解决这个问题?

【问题讨论】:

  • 对不起!!!!该代码块的执行顺序为block1 -> block2 -> block3 -> block4

标签: node.js unit-testing websocket socket.io mocha.js


【解决方案1】:

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

请记住,这些调用是异步的,因此顺序并不重要,但您需要在触发某些东西之前准备好接收。

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

【讨论】:

  • 但是没有效果,BEFORE或者AFTER没有影响。因为playerX.send(messageX)playerX.once('xxx', listener) 是同步调用的,所以监听器总是在它们之后调用。
  • 对不起,我错了。我的代码是正确的,问题来自其他地方。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2014-02-13
      • 1970-01-01
      • 2023-03-17
      • 2011-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多