gpt4 book ai didi

node.js - 如何测试 node.js websocket 服务器?

转载 作者:搜寻专家 更新时间:2023-10-31 22:35:02 25 4
gpt4 key购买 nike

我正在使用标准配置的 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
}

在 switch 中调用的每个方法都会向客户端发送回一条消息。

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);
}
})
};

现在我的问题是我想对我的代码进行测试(我想迟到总比不测试好),但我不知道该怎么做。我开始使用 mocha + supertest 编写普通的 http 测试,但我只是不知道如何处理 websockets。

我希望只有一个 websocket 连接可以在所有测试中重用,我在第一条消息后将 websocket 连接与用户 session 绑定(bind),我也想测试这种持久性。

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

最佳答案

工作中的同事问它是否真的需要一个客户端连接,或者是否可以模拟它。事实证明这是要走的路。我写了一个小助手类 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);
}
}
}

现在在我的 mocha 测试中,我只是这样做

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();
})
})
})

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

关于node.js - 如何测试 node.js websocket 服务器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21293311/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com