3

我需要使用 sinon 为 Web 套接字客户端编写单元测试。代码如下:

Socket = {
    connect: function ()
    {
        socket = new WebSocket('ws://localhost:12345');
        socket.onopen = function()
        {

            console.log('connected to the server');
        };

        socket.onmessage = function(message)
        {
            console.log('Received:', message.data);
        };

    }
};
4

1 回答 1

1

我们需要在connect方法中最后返回套接字实例。onopen因为您为和onmessage事件分配了两个新功能。它将覆盖套接字对象上的spyor方法。stub

测试环境:节点

这是单元测试解决方案:

index.js

const Socket = {
  connect: function() {
    socket = new WebSocket("ws://localhost:12345");
    socket.onopen = function() {
      console.log("connected to the server");
    };

    socket.onmessage = function(message) {
      console.log("Received:", message.data);
    };
    return socket;
  }
};

module.exports = Socket;

index.spec.js

const sinon = require("sinon");
const { expect } = require("chai");
const Socket = require("./index");

class WebSocket {
  constructor(uri) {}
  onopen() {}
  onmessage() {}
}
global.WebSocket = WebSocket;

describe("17806481", () => {
  it("should test connect correctly", () => {
    const logSpy = sinon.spy(console, "log");
    const socket = Socket.connect();
    const onopenSpy = sinon.spy(socket, "onopen");
    const onmessageSpy = sinon.spy(socket, "onmessage");
    onopenSpy();
    expect(logSpy.firstCall.calledWith("connected to the server")).to.be.true;
    const mMessage = { data: "fake data" };
    onmessageSpy(mMessage);
    expect(logSpy.secondCall.calledWith("Received:", mMessage.data)).to.be.true;
  });
});

模块覆盖率 100% 的单元测试结果Socket

 17806481
connected to the server
Received: fake data
    ✓ should test connect correctly


  1 passing (10ms)

---------------|----------|----------|----------|----------|-------------------|
File           |  % Stmts | % Branch |  % Funcs |  % Lines | Uncovered Line #s |
---------------|----------|----------|----------|----------|-------------------|
All files      |      100 |      100 |       75 |      100 |                   |
 index.js      |      100 |      100 |      100 |      100 |                   |
 index.spec.js |      100 |      100 |       60 |      100 |                   |
---------------|----------|----------|----------|----------|-------------------|

源码:https ://github.com/mrdulin/mocha-chai-sinon-codelab/tree/master/src/stackoverflow/17806481

于 2019-11-20T07:08:57.877 回答