Единичное тестирование приложения 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');
});
Надеюсь, это то, что вы ищете.