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

我尝试使用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"}');

我的问题是

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

使用sinon.js,我无法通过使用分别使用FakeXMLHttpRequest()和fakeServer.create()的方式获得虚构的Websocket对象,如假的XMLHttpRequest和服务器,

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

最佳答案
通常,你会做ws = sinon.createStubInstance(WebSocket),但是这是不可能的,因为WebSocket.prototype上的属性在读取它们时会抛出异常.这有两种方法.

>你可以添加一个useFakeWebSocket来覆盖WebSocket.这将类似于使用XHTMLHttpRequest对XMLHttpRequest的使用.
Duck通过遍历原型来输出WebSocket对象.

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

如果你想实现一个模拟回声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');
});

我希望这是你正在寻找的.

转载注明原文:javascript – 由sinon.js对websocket应用程序的单元测试 - 代码日志