我有一个express.js服务器,它使用数据库进行存储。客户端可以通过http端点读取和写入数据。客户端还可以通过socket.io监听数据更改。
我的简化代码:
socket.io事件处理程序
export default (io, store, db) => {
io.on('connection', function(socket){
socket.on('disconnect', function() {
logger.log("Disconnect. Socket count: " + count)
// logic which removes socket
})
socket.on('observe', function(json){
logger.log("Observe " + collection)
// logic which stores socket for later updates
// logic which gets the current data from the database
socket.emit('change', {theLatestData})
})
})
}
socket.io客户端
var socket = io("http://localhost:8080")
socket.emit('observe', 'collectionName')
socket.on('change', function(data) {
// logic which does something with the data
})
HTTP端点:
api.post('/collection/:collection', (req, res) => {
// logic which adds some data to a collection in the db
// logic which emits updates the attached sockets
})
看起来一切正常,但是事件处理程序中的逻辑没有代码覆盖。
我想编写mocha测试,这些测试断言当套接字连接到服务器时它将获取最新数据,并且当套接字连接到服务器时,附加套接字的数量将依此类推。
但是,我无法找到合适的方法来编写这些测试。我意识到我可以将处理程序逻辑提取到模块中并进行隔离测试,但是我真的很希望测试能够真正在事件处理程序中运行。
我是否应该实际上在测试中启动服务器并连接套接字?有没有方法可以连接模拟套接字并以某种方式触发observe
和disconnect
事件,从而在处理程序中行使逻辑。
我已经在SO上查看了类似的问题和答案,但到目前为止,它们并没有真正帮助我。