Интеграционное тестирование маршрута без супертеста (запуск вручную и закрытие сервера из теста) - PullRequest
0 голосов
/ 08 февраля 2020

Я пытаюсь провести интеграционное тестирование маршрута без модуля 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.

Буду признателен за руководство о том, почему он ведет себя не так, как ожидалось, и за подробностями реализации того, как я могу изменить его, чтобы он сделал.

...