8

標準構成で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 テストを書き始めましたが、websocket の処理方法がわかりません。

すべてのテストで再利用する websocket 接続を 1 つだけにしたいのですが、最初のメッセージの後に websocket 接続をユーザーセッションにバインドしています。その永続性もテストしたいと思います。

ws クライアントの onmessage イベントをどのように利用し、テストで利用するのですか? テストでは、受信したメッセージをどのように区別し、どのメッセージを待つべきかを知ることができますか?

4

1 に答える 1

2

職場の同僚から、本当にクライアント接続が必要なのか、それとも単にモックアップできるのかと尋ねられました。それが進むべき道であることが判明しました。ちょっとしたヘルパークラス 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();
        })
    })
})

それはチャームのように機能し、リクエスト間の接続状態と変数を保持します。

于 2014-01-24T16:24:41.600 に答える