2014-01-22 3 views
6

나는 표준 구성 sockjs을 사용하고 있습니다.node.js websocket 서버를 테스트하는 방법은 무엇입니까?

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

지금 내 문제는 내가 (더 늦은 것 같아요 결코 이상) 내 코드에 대한 테스트를하고 싶습니다 내가 그것을 수행하는 방법 아무 생각이 없다는 것입니다. 나는 모카 + supertest와 정상 HTTP 테스트를 쓰기 시작하지만 난 그냥 WebSocket을 처리하는 방법을 모르겠어요.

내가 모든 테스트를 통해, 내가 첫 번째 메시지 이후에 사용자 세션과 웹 소켓 연결을 바인딩 그리고 난뿐만 아니라 지속성을 테스트 할 재사용 할 수있는 단 하나의 웹 소켓 연결을하고 싶습니다

.

어떻게 WS 클라이언트의의 onMessage 이벤트를 사용하고 내 테스트에서 그것을 사용합니까? 검사가받은 메시지를 어떻게 구분할 수 있는지, 그리고 어떤 메시지가 기다려야 하는지를 알 수 있습니까? 직장에서

답변

1

의 동료는 정말 클라이언트 연결 할 필요하거나 그냥 모의 할 수있을 것인지 물었다. 그것은가는 길이었다. 나는

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

그것은 매력처럼 작동을하고 요청 사이의 연결 상태 및 변수를 지속 wsMockjs 약간의 헬퍼 클래스를 썼다.

관련 문제