模拟 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 服务器进行单元测试的主要内容,如果未能解决你的问题,请参考以下文章

使用模拟 MongoDB 服务器进行单元测试

在 Grails 中对服务进行单元测试时如何模拟请求

如何模拟 acegi 身份验证服务以进行单元测试?

评测基于websocket协议的压力测试

如何在 Angular 组件中模拟服务功能以进行单元测试

手段编写基于 Websocket 协议的压力测试