我尝试使用 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 对象的任何过程,例如伪造的 XMLHttpRequest
和 server
分别使用 useFakeXMLHttpRequest()
和 fakeServer.create()
在 sinon.js 上有实现这个的过程吗?
最佳答案
通常,你会做 ws = sinon.createStubInstance(WebSocket)
,但这是不可能的,因为 WebSocket.prototype 上的属性在读取它们时会抛出异常。有两种解决方法。
- 您可以添加
useFakeWebSocket
到 sinon 覆盖WebSocket
.这类似于useFakeXMLHttpRequest
对 XMLHttpRequest 执行。 鸭子打出
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');
});
希望这就是您要找的。p>
关于javascript - sinon.js 对 websocket 应用程序进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22995976/