2014-01-22 3 views
6

Я использую sockjs со стандартной конфигурацией.Как проверить сервер websocket node.js?

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

Теперь моя проблема заключается в том, что я хотел бы сделать тесты для моего кода (лучше поздно, чем никогда, я думаю), и я понятия не имею, как это сделать. Я начал писать обычные тесты http с помощью mocha + supertest, но я просто не знаю, как обращаться с websockets.

Я хотел бы иметь только одно подключение к Интернету для повторного использования через все тесты, я связываю соединение с веб-узлом с сеансом пользователя после первого сообщения, и я хочу также проверить эту персистенцию.

Как использовать событие onmessage клиента ws и использовать его в моих тестах? Как тесты могут рассказать обо всех полученных сообщениях и узнать, какой из них они должны ждать?

ответ

1

Collegue at work спросил, действительно ли это должно быть подключение к клиенту или можно было бы просто издеваться над ним. Оказалось, что это был путь. Я написал небольшой вспомогательный класс 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(); 
     }) 
    }) 
}) 

Он работает как шарм и упорствовать состояние соединения и переменные между запросами.

Смежные вопросы