Как правильно тестировать fastify приложение с supertest?
Пытаюсь прикрутить supertest к fastify:
const request = require('supertest');
const app = require('fastify')();
app.get('/user', function(_, res) {
res.status(200).send({ name: 'john' });
});
request(app.server)
.get('/user')
.then(res => {
console.info(res.body);
});
В консоли вижу:
{ statusCode: 404, error: 'Not Found', message: 'Not Found' }
ЧЯДНТ? Как получить ответ от приложения?
Ответы (1 шт):
Автор решения: nörbörnën
→ Ссылка
В документации fastify описаны несколько подходов к тестированию приложений, твой подход ближе всего к Testing with a running server
Причина твоего кейса в том, что у тебя не запускается сам сервер:
await app.ready()
Promise { <pending> } // в эксперименте я не стал ждать resolve этого promise
{"level":30,"time":1603197725330,"pid":45535,"hostname":"negroponta-mac.local","reqId":1,"req":{"method":"GET","url":"/user","hostname":"127.0.0.1:62962","remoteAddress":"::ffff:127.0.0.1","remotePort":62963},"msg":"incoming request"}
{"level":30,"time":1603197725338,"pid":45535,"hostname":"negroponta-mac.local","reqId":1,"res":{"statusCode":200},"responseTime":6.021948993206024,"msg":"request completed"}
{ name: 'john' }
Полный пример:
const tap = require('tap')
const supertest = require('supertest')
tap.test('GET `/user` route', async (t) => {
const app = require('fastify')();
app.get('/user', function(_, res) {
res.status(200).send({ name: 'john' });
});
t.tearDown(() => app.close())
await app.ready()
const response = await supertest(app.server)
.get('/user')
.expect(200)
.expect('Content-Type', 'application/json; charset=utf-8')
t.deepEqual(response.body, { name: 'john' })
})