sinon.js对websocket应用程序的单元测试

Sum*_*ati 14 javascript sockets unit-testing websocket sinon

我试图使用sinon.js对Web套接字应用程序进行单元测试,

sinon的 github上的一个用户做了这个,但我无法理解它如何帮助单元测试websocket应用程序来验证发送到假服务器的接收数据.

var dummySocket = { send : sinon.spy()};
sinon.stub(window, 'WebSocket').returns(dummySocket);
dummySocket = new WebSocket('ws://html5rocks.websocket.org/echo');
dummySocket.onopen();
dummySocket.onmessage(JSON.stringify({ hello : 'from server' }));
// You can assert whether your code sent something to the server like this:
sinon.assert.calledWith(dummySocket.send, '{"the client":"says hi"}');
Run Code Online (Sandbox Code Playgroud)

我的问题是

  • 如何从虚假服务器接收早先发送到服务器的相同数据.
  • 如何使用send假套接字对象的方法将数据发送到假服务器(例如: - socket.send())?
  • 如何从服务器上获取数据 dummySocket.onmessage = function (msg){}

使用sinon.js,我无法获得任何进程来创建假的websocket对象,如假XMLHttpRequestserver分别使用useFakeXMLHttpRequest()fakeServer.create()

在sinon.js上有没有实现这个的过程?

Mat*_*att 2

通常,您会这样做ws = sinon.createStubInstance(WebSocket),但这是不可能的,因为 WebSocket.prototype 上的属性在读取它们时会抛出异常。有两种方法可以解决这个问题。

  1. 您可以useFakeWebSocket向 sinon 添加 a 来覆盖WebSocket. 这与 XMLHttpRequest 的作用类似useFakeXMLHttpRequest
  2. WebSocketDuck通过迭代原型来输出对象。

    beforeEach(function () {
        var ws = {};
        for (var prop in WebSocket.prototype) {
            ws[prop] = function () {}; // some properties aren't functions.
        }
    });
    
    Run Code Online (Sandbox Code Playgroud)

如果您想实现一个模拟 echo WebSocket 服务器以便可以测试您的事件处理程序,您可以这样做:

var ws;
beforeEach(function () {
    ws = {
        send: function (msg) {
            this.onmessage({ data: msg });
        },
        onmessage: function (e) {
            // stub
        }
    };
});
it('should echo', function () {
    var spy = sinon.spy(ws, 'onmessage');
    ws.send('this is a test');
    assertEquals(spy.args[0][0].data, 'this is a test');
});
Run Code Online (Sandbox Code Playgroud)

我希望这就是您正在寻找的。