2016-05-13 38 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

相关问题