javascript - sinon.js 对 websocket 应用程序进行单元测试

标签 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"}');

我的问题是

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

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

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

最佳答案

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

  1. 您可以添加 useFakeWebSocket到 sinon 覆盖 WebSocket .这类似于 useFakeXMLHttpRequest对 XMLHttpRequest 执行。
  2. 鸭子打出 WebSocket通过迭代原型(prototype)来对象。

    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 应用程序进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22995976/

相关文章:

JAVA TLS SOCKETS : bufferedreader. ready() 始终为 false

Node.js - 当用户互联网丢失时不会触发套接字关闭事件

php - 在使用 PHPUnit 进行测试时使用实现 IteratorAggregate 接口(interface)的 Mock 类时如何防止重新声明错误?

java - 在 junit 测试中模拟 DateFormat 类

javascript - 是否有运行 Firebug 控制台内容的热键?

javascript - 为什么此 URL 不属于同源策略?

javascript - 如何隐藏具有重复数据属性的 child 的所有 parent

javascript - 为什么 innerHTML 属性会自动 trim 字符串?

python - 如果没有接收数据并且数据长度未知,如何在python中中断while循环[TCP]

c# - 什么是 Rhino Mocks Repeat?