2016-05-13 3 views
1

websocketイベントが発生した後、データが自分のデータベースに追加されることをテストしようとしています。websocketイベントをテストするコードを書くには?

私が協力しているアプリケーションでは、既にこれの実例があります。

it('some test name', function (done) { 
    this.timeout(12000) 

    var socket = io.connect('http://localhost:3000', { 
     'transports': [ 
     'websocket', 
     'flashsocket', 
     'jsonp-polling', 
     'xhr-polling', 
     'htmlfile' 
     ] 
    }) 

    socket.emit('some-room-event', { 
     participant: 'p1', 
     room: 12, 
     active: true 
    }) 

    setTimeout(function() { 
     app.service('rooms').get(12) 
     .then(function (room) { 
      assert(room.active === true) 
      socket.disconnect() 
      done() 
     }).catch(function (err) { 
      socket.disconnect() 
      done(err) 
     }) 
    }, 11000) 
    }) 

私はルビーの背景から来て、プロジェクトにスロットを入れているので、私はかなり新しいです。タイムアウトの使用がコードの匂いであるように感じ、それはちょうど間違っていると感じます。あなたは、任意の待機時間でテストを実行するのにかかる時間を長くしたくありません。

私はこれについて多くの記事を読んでいますが、かなり混乱しています。このコードを構造化し、潜在的にsetTimeoutを取り除く良い方法はありますか?

私はfeathersjs、mochaとassertを使用しています。

答えて

1

テストされているイベントは、roomsサービスに対して何かを行う通常のwebsocketイベントのようです。

テストでの任意のタイムアウトは、websocketイベントが正常に完了したときに認識しない問題を解決する最良の方法ではありません。私はあなたが行うことができると思うことは(ソケットイベントがちょうど部屋の状態を更新するために、公式socket.emit('rooms::update', data)を使用していないことを少し奇妙ですが)部屋はupdatedまたはpatchedあるときa Feathers service eventに耳を傾けることです。

it('some test name', function (done) { 
    var socket = io.connect('http://localhost:3000', { 
    'transports': [ 
     'websocket', 
     'flashsocket', 
     'jsonp-polling', 
     'xhr-polling', 
     'htmlfile' 
    ] 
    }); 

    app.service('rooms').once('updated', function(room) { 
    assert(room.active); 
    done(); 
    }); 

    socket.emit('some-room-event', { 
    participant: 'p1', 
    room: 12, 
    active: true 
    }); 
}); 
+0

はい、それはまた私に間違って感じました。あなたが新しい時に人を説得するのは難しいです。ありがとう。 –

+0

私はそれを疑いません。それでもあなたは間違っていません。フレームワークの著者の1人からの入力があなたをバックアップするのに役立つことを願っています:) – Daff

関連する問題