【问题标题】:Mocking Websocket Server for Unit Testing模拟 Websocket 服务器进行单元测试
【发布时间】: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 服务。但在这种情况下,我认为这不是一个选择。

【问题讨论】:

    标签: angularjs node.js sockets unit-testing sockjs


    【解决方案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 方法的作用进行单元测试。可以发一下吗?
    猜你喜欢
    • 2013-04-01
    • 1970-01-01
    • 2011-03-12
    • 1970-01-01
    • 1970-01-01
    • 2017-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多