【问题标题】:Unit testing of websocket application by sinon.jssinon.js 对 websocket 应用的单元测试
【发布时间】:2014-05-24 15:04:45
【问题描述】:

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

我的问题是

  • 我怎样才能从假服务器接收到之前发送到服务器的相同数据。
  • 如何使用send伪造套接字对象的方法向伪造服务器发送数据(例如:-socket.send())?
  • 如何从dummySocket.onmessage = function (msg){} 上的服务器获取数据

使用 sinon.js,我无法通过分别使用 useFakeXMLHttpRequest() 来创建假的 websocket 对象,例如假 XMLHttpRequestserverfakeServer.create()

在 sinon.js 上有什么流程可以实现吗?

【问题讨论】:

  • github 用户提出了一些建议,并明确表示他不知道它是否有效(提示:它不起作用)。
  • 你有没有想过这个问题?如果是这样,请发布您的发现
  • 我不知道这是否对您有所帮助,但我编写了一个简单的 npm 模块,用作 socket.io 服务器的包装器。在测试这个module 时,我没有使用sinon,而是使用socket.io Client 来发送/接收数据以进行测试。如果这是您需要的,我可以在答案中详细说明我的方法。
  • 您可能想看看模拟套接字,它似乎可以满足您的需求:github.com/thoov/mock-socket
  • 你可以用一个假的XMLHttpRequest 来模仿Socket请求,当它返回时调用onmessage。但这不会测试实际的网络套接字连接,而是测试网络套接字流。因此,如果您想测试实际连接,@MichaelBleigh 建议的方法可能会奏效。

标签: javascript sockets unit-testing websocket sinon


【解决方案1】:

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

  1. 您可以将useFakeWebSocket 添加到 sinon 以覆盖WebSocket。这类似于 useFakeXMLHttpRequest 对 XMLHttpRequest 所做的。
  2. Duck 通过迭代原型输出WebSocket 对象。

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

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

我希望这就是你要找的。​​p>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-28
    • 1970-01-01
    • 2020-11-02
    • 2013-01-23
    • 2014-01-26
    • 2013-07-04
    • 2014-06-03
    相关资源
    最近更新 更多