模拟 Websocket 服务器进行单元测试
Posted
技术标签:
【中文标题】模拟 Websocket 服务器进行单元测试【英文标题】:Mocking Websocket Server for Unit Testing 【发布时间】:2015-11-29 23:22:32 【问题描述】:我在客户端使用 sockJS 来实现我的项目的 websockets(套接字服务器由 Java Spring 实例运行)。我无法弄清楚如何为我的前端套接字单元测试模拟 websockets 服务器。
我有一些函数依赖于从服务器流式传输的数据。但我不知道如何模拟这些数据以调用 sock.onmessage。
我的客户端一般是这样设置的:
websocket-client.js (sockJS)
sock = new SockJS('/server/uri');
sock.onopen = function()
;
sock.onmessage = function(e)
var message = e.data.message;
displayMessage(message);
;
sock.onclose = function()
// clean up stuff
;
我将 Karma 和 Chai 用于我的测试运行程序/断言库。
由于这是一个 Angular 应用程序,通常我可以使用 $httpBackend 模拟我的 API 服务。但在这种情况下,我认为这不是一个选择。
【问题讨论】:
【参考方案1】:最简单的方法是将 SockJS 包装在工厂/服务中:
angular
.module('app')
.factory('sockJS', function ()
return
create: function (uri)
return new SockJS(uri);
;
);
然后你可以注入 sockJS 并模拟它。
angular
.module('app')
.controller('MainCtrl', function($scope, sockJS)
var sock = sockJS.create('/server/uri');
sock.onopen = function()
;
sock.onmessage = function(e)
// do stuff with e data
;
sock.onclose = function()
// clean up stuff
;
);
【讨论】:
这听起来是正确的方向。那么我将如何测试 sock.onmessage 中发生的逻辑呢?我需要一种方法来调用 onmessage 函数,通常在服务器发出套接字消息时由 sockjs 库处理。 您能否在您的问题中添加一些逻辑?与e有关吗? 是的,例如,我将有一个函数来解析 e 对象中包含的字符串并将结果显示给用户。我希望能够对 onmessage 功能块中的语句进行单元测试。我已经更新了我的问题以反映这一点。 我假设您想要对实际 displayMessage 方法的作用进行单元测试。可以发一下吗?以上是关于模拟 Websocket 服务器进行单元测试的主要内容,如果未能解决你的问题,请参考以下文章