2016-05-13 37 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,摩卡和斷言。

回答

1

它看起來像正在測試的事件只是一個正常的websocket事件,對rooms服務做了一些事情。

測試中的任意超時絕對不是解決websocket事件在完成任何應該執行的操作時不會確認的問題的最佳方法。我覺得你可以做的是聽a Feathers service event當室內updatedpatched(儘管這是一個有點奇怪的是,插座事件不只是使用官方socket.emit('rooms::update', data)更新聊天室狀態):

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

我不懷疑它。儘管如此,仍然不會讓你錯。希望來自框架作者之一的輸入有助於支持你:) – Daff

相關問題