当前位置: 首页 > 知识库问答 >
问题:

如何测试节点。JSWebSocket服务器?

须新
2023-03-14

我使用标准配置的sockjs。

   var ws = sockjs.createServer();
    ws.on('connection', function(conn) {
        conn.on('data', function(message) {
            wsParser.parse(conn, message)
        });
        conn.on('close', function() {

        });
    });

    var server = http.createServer(app);
    ws.installHandlers(server, {prefix:'/ws'});
    server.listen(config.server.port, config.server.host);

wsParser。parse函数的工作原理如下:

function(conn, message) {

(...)

switch(message.action) {
    case "titleAutocomplete":
        titleAutocomplete(conn, message.data);
        break;
    (...) // a lot more of these
 }

交换机中调用的每个方法都会向客户端发回一条消息。

var titleAutocomplete = function(conn, data) {

    redis.hgetall("titles:"+data.query, function(err, titles){
        if(err) ERR(err);

        if(titles) {
            var response = JSON.stringify({"action": "titleAutocomplete", "data": {"titles": titles}});
            conn.write(response);
        } 
    })
};

现在我的问题是,我想对我的代码进行测试(我想晚做总比不做好),但我不知道如何做。我开始写正常的超文本传输协议测试在摩卡超级测试,但我只是不知道如何处理webSocket。

我希望通过所有测试只有一个webSocket连接可以重用,我在第一条消息后将webSocket连接与用户会话绑定,我也想测试这种持久性。

如何使用ws客户端的onMessage事件并在测试中使用它?测试如何区分收到的消息,并知道他们应该等待哪一个?

共有1个答案

闾丘文昌
2023-03-14

Collegue在工作中问,它是否真的需要一个客户端连接,或者是否可以只模拟它。事实证明,这是一条路要走。我编写了一个小助手类wsMockjs

var wsParser = require("../wsParser.js");

exports.createConnectionMock = function(id) {
    return {
        id: id,
        cb: null,
        write: function(message) {
            this.cb(message);
        },
        send: function(action, data, cb) {
            this.cb = cb;
            var obj = {
                action: action,
                data: data
            }
            var message = JSON.stringify(obj);
            wsParser.parse(this, message);
        },
        sendRaw: function(message, cb) {
            this.cb = cb;
            wsParser.parse(this, message);
        }
    }
}

现在,在我的摩卡咖啡测试中,我就是这么做的

var wsMock = require("./wsMock.js");
ws = wsMock.createConnectionMock("12345-67890-abcde-fghi-jklmn-opqrs-tuvwxyz");
(...)
describe('Websocket server', function () {

    it('should set sessionId variable after handshake', function (done) {
        ws.send('handshake', {token: data.token}, function (res) {
            var msg = JSON.parse(res);
            msg.action.should.equal('handshake');
            msg.data.should.be.empty;
            ws.should.have.property('sessionId');
            ws.should.not.have.property('session');
            done();
        })
    })

    it('should not return error when making request after handshake', function (done) {
        ws.send('titleAutocomplete', {query: "ter"}, function (res) {
            var msg = JSON.parse(res);
            msg.action.should.equal('titleAutocomplete');
            msg.data.should.be.an.Object;
            ws.should.have.property('session');
            done();
        })
    })
})

它就像一个符咒,在请求之间保持连接状态和变量。

 类似资料:
  • 像组件一样,服务通常需要依赖,Angular通过服务类的构造函数注入。由于我们在Angular的引导过程之外初始化这些类,我们必须自己显式注入这些依赖。这是通过使用TestBed配置测试模块传回所需的依赖项(如HTTP模块)来实现的。

  • 注:本节未经校验,如有问题欢迎提issue 多节点测试概念 当我们谈论Akka多节点测试时,我们指的是多个actor系统在不同Jvm上运行协同测试的过程。多节点测试套件由三个主要部分组成。 测试导体。协调和控制测试的节点。 多节点规格。启动TestConductor的方便的包装器,并允许所有节点连接到它。 SbtMultiJvm插件。启动可能在多个机器上的多个Jvm的测试。 测试导线 多节点测试的

  • 我有一个服务器,用Java编写的,那是我的应用程序,我想在上面运行一些测试。我正在使用gradle来管理依赖项和构建任务等,所以我也想在这方面使用它。我需要启动服务器,然后运行我的单元测试,这会对它发出一堆HTTP请求,然后在测试完成后,理想情况下甚至关闭服务器。所以我尝试在build.gradle中添加(jettyRunWar是运行服务器的工具),但我想这太简单了,因为从不从jettyRunWa

  • 我正在尝试访问一个运行在Openshift吊舱中的Flask服务器。 为此,我创建了如下服务。 1)首先,我豆荚ping到另一个豆荚并得到响应。 但是,当我尝试时,它没有响应。 2) 之后,我尝试从一个pod访问集群IP。在这种情况下,都不可访问。 请告诉我哪里出错了。为什么上面的情况#1,#2失败。如何访问集群IP服务。 我对服务和访问服务完全陌生,因此我可能缺少一些基础知识。 我回答了其他问题

  • 在研究了这些问题之后: Jest环境的异步设置 导入中未定义的窗口/文档 使用. ts文件(TypeScript)配置Jest全局测试设置 关于app.listen()回调 如何编写Jest配置文件 NodeJS:如何获取服务器的端口? https://alligator.io/nodejs/serving-static-files-in-express/ Promisifyserver.list

  • SAP商务1905 我有一个节点应用程序,我想与我的Hybris集成。我已经创建了一个自定义的addon,并将我的节点应用程序文件放在addon扩展中。现在我想在Hybris服务器start上运行下面的命令。 通过将npm命令放在myextension_compileuisrc_executor buildcallback下,我可以在ant构建上启动节点服务器。 但我的目标是只在MyExtensi