node.js - 集成测试 node.js socket.io 服务器

标签 node.js unit-testing testing socket.io automated-tests

我正在尝试设置一个服务器来响应使用 nodejs、express 和 socket.io 的 socket.io 客户端。我想编写测试来探测服务器并确保它正确处理事件并向客户端发送适当的响应。

我尝试使用 jest 编写一些自动化测试,但我不知道如何实际向服务器发送事件并让它响应。

Unit testing Node.js and WebSockets (Socket.io)

我查看了上面的帖子,但它对我不起作用...

最佳答案

查看这个基于 promise 良好实践样板解决方案。 您可以用它测试服务器的整个 io 事件,毫不费力。 您只需复制样板测试并根据需要添加您自己的代码。

查看 GitHub 上的存储库以获取完整的源代码。

https://github.com/PatMan10/testing_socketIO_server

const io = require("socket.io-client");
const ev = require("../utils/events");
const logger = require("../utils/logger");

// initSocket returns a promise
// success: resolve a new socket object
// fail: reject a error
const initSocket = () => {
  return new Promise((resolve, reject) => {
    // create socket for communication
    const socket = io("localhost:5000", {
      "reconnection delay": 0,
      "reopen delay": 0,
      "force new connection": true
    });

    // define event handler for sucessfull connection
    socket.on(ev.CONNECT, () => {
      logger.info("connected");
      resolve(socket);
    });

    // if connection takes longer than 5 seconds throw error
    setTimeout(() => {
      reject(new Error("Failed to connect wihtin 5 seconds."));
    }, 5000);
  });
};

// destroySocket returns a promise
// success: resolve true
// fail: reject false
const destroySocket = socket => {
  return new Promise((resolve, reject) => {
    // check if socket connected
    if (socket.connected) {
      // disconnect socket
      logger.info("disconnecting...");
      socket.disconnect();
      resolve(true);
    } else {
      // not connected
      logger.info("no connection to break...");
      resolve(false);
    }
  });
};

describe("test suit: Echo & Bello", () => {
  test("test: ECHO", async () => {
    try {
      // create socket for communication
      const socketClient = await initSocket();

      // create new promise for server response
      const serverResponse = new Promise((resolve, reject) => {
        // define a handler for the test event
        socketClient.on(ev.res_ECHO, data4Client => {
          //process data received from server
          const { message } = data4Client;
          logger.info("Server says: " + message);

          // destroy socket after server responds
          destroySocket(socketClient);

          // return data for testing
          resolve(data4Client);
        });

        // if response takes longer than 5 seconds throw error
        setTimeout(() => {
          reject(new Error("Failed to get reponse, connection timed out..."));
        }, 5000);
      });

      // define data 4 server
      const data4Server = { message: "CLIENT ECHO" };

      // emit event with data to server
      logger.info("Emitting ECHO event");
      socketClient.emit(ev.com_ECHO, data4Server);

      // wait for server to respond
      const { status, message } = await serverResponse;
      expect(status).toBe(200);
      expect(message).toBe("SERVER ECHO");
    } catch (error) {
      logger.error(error);
    }
  });

  test("test BELLO", async () => {
    try {
      const socketClient = await initSocket();
      const serverResponse = new Promise((resolve, reject) => {
        socketClient.on(ev.res_BELLO, data4Client => {
          const { message } = data4Client;
          logger.info("Server says: " + message);
          destroySocket(socketClient);
          resolve(data4Client);
        });

        setTimeout(() => {
          reject(new Error("Failed to get reponse, connection timed out..."));
        }, 5000);
      });

      const data4Server = { message: "CLIENT BELLO" };
      logger.info("Emitting BELLO event");
      socketClient.emit(ev.com_BELLO, data4Server);

      const { status, message } = await serverResponse;
      expect(status).toBe(200);
      expect(message).toBe("SERVER BELLO");
    } catch (error) {
      logger.error(error);
    }
  });
});

关于node.js - 集成测试 node.js socket.io 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54390971/

相关文章:

javascript - 如何对 Node.js 流进行基准测试?

c# - 使用 FakeItEasy 断言没有使用任何通用参数进行调用

sql - 我应该如何执行 SQL ETL 脚本和 SPROC 的自动化测试?

perl - 我怎样才能通过 prove (Test::More) 一个论点,例如API 网址?

java - JUnit 测试抛出异常的错误形式?

angularjs - ng 服务抛出未处理的错误事件

javascript - 为什么我无法从导出函数获取数据

node.js - 使用 websocket+node.js 的聊天服务器与使用 xmpp 的 native 客户端

javascript - 单元测试 Sails JS 1.0 助手

从 OSX : VirtualBox settings or good alternative 在 IE6 中测试