Я пытаюсь провести интеграционное тестирование маршрута без модуля supertest
. Причина этого заключается в том, что это маршрут Server Sent Events (SSE), и в настоящее время ни один клиент не поддерживает тестирование маршрутов SSE. Это означает, что мне нужно вручную раскрутить свой сервер и подписаться на маршрут в тесте, прежде чем я смогу провести интеграционный тест.
. / Src / routers / main. js
const eventEmitter = require('./src/helpers/event-emitter')
// Server Sent Events route for receiving realtime notifications.
router.get('/updates', (req, res) => {
res.writeHead(200, {
'Content-Type': 'text/event-stream',
'Cache-Control': 'no-cache',
'Connection': 'keep-alive'
})
res.write('\n')
// One triggered listener instance is added for each connected client.
const triggered = (info) => {
console.log('Triggered') // Log onto console to make sure it is working as expected.
res.write(`data: ${JSON.stringify(info)}\n\n`)
}
eventEmitter.addListener(constants.events.TRIGGERED, triggered)
req.on('close', () => {
eventEmitter.removeListener(constants.events.TRIGGERED, triggered)
})
})
module.exports = router
. / Tests / routers / main.test. js
const app = require(../app)
const eventEmitter = require('../src/helpers/event-emitter')
const EventSource = require('eventsource')
test('Should subscribe to /updates and receive realtime notifications', async() => {
const server = app.listen(3000) // Manually spin up server
const stream = new EventSource('/updates') // Subscribe to SSE /updates stream
eventEmitter.emit(constants.events.TRIGGERED, { message: 'Worked' }) // Emit event
server.close()
})
Я ожидаю, что это напечатает Triggered
в консоли, поскольку в тесте я вручную раскручиваю сервер, подписываюсь на него с помощью модуля EventSource
и затем генерирую событие TRIGGERED
. Тем не менее, он даже не входит в кодовый блок /updates
.
Буду признателен за руководство о том, почему он ведет себя не так, как ожидалось, и за подробностями реализации того, как я могу изменить его, чтобы он сделал.