Единичное тестирование приложения websocket от sinon.js

Я попытался выполнить модульное тестирование для приложения веб-сокета, используя sinon.js,

Один из пользователей github sinon сделал это, но я не могу понять, как это помогает unit test приложения 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 объекта, например, для поддельных XMLHttpRequest и server, используя соответственно useFakeXMLHttpRequest() и fakeServer.create()

Есть ли какой-либо процесс для достижения этого на sinon.js?

Ответы

Ответ 1

Обычно вы выполняете ws = sinon.createStubInstance(WebSocket), но это невозможно, так как свойства при проверке исключений WebSocket.prototype при чтении их. Существует два пути.

  • Вы можете добавить a useFakeWebSocket в sinon, чтобы перезаписать WebSocket. Это было бы похоже на то, что useFakeXMLHttpRequest делает для XMLHttpRequest.
  • Утка вычеркивает объект WebSocket путем итерации над прототипом.

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

Если вы хотите реализовать mock 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');
});

Надеюсь, это то, что вы ищете.