У меня есть сервер 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 client
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, но они непока мне очень не помогает.