Тестирование: inject и node:test
Тест — код, который вызывает ваш API и проверяет ответ. Fastify умеет выполнять запрос прямо в памяти через app.inject(): порт не занимается, сеть не нужна, тест работает быстро. Запускать тесты будет встроенный в Node.js модуль node:test, ставить ничего не нужно.
Скрипт запуска
Добавьте скрипт в package.json:
{
"scripts": {
"test": "node --test"
}
}node --test находит и запускает файлы с именами вида *.test.js.
Первый тест
Здесь пригодится разделение app.js и server.js: тест создаёт приложение через buildApp, не вызывая listen. Создайте test/posts.test.js:
// test/posts.test.js
import { test } from 'node:test';
import assert from 'node:assert/strict';
import { buildApp } from '../src/app.js';
process.env.DB_FILE = ':memory:';
process.env.JWT_SECRET = 'test-secret-1234567890';
process.env.ADMIN_NAME = 'anna';
process.env.ADMIN_PASSWORD = 'test-password';
test('GET /posts возвращает пустой список', async (t) => {
const app = buildApp();
t.after(() => app.close());
const response = await app.inject({ method: 'GET', url: '/posts' });
assert.equal(response.statusCode, 200);
assert.deepEqual(response.json(), []);
});DB_FILE=':memory:' создаёт для теста пустую базу в памяти, поэтому настоящие статьи не пострадают. t.after() закрывает приложение после теста, а response.json() разбирает тело ответа.
Запустите тесты:
npm testВ терминале появится название теста с отметкой об успехе и итог pass 1.
Запрос с телом
В inject можно передать метод, адрес, заголовки и тело — объект Fastify сам превратит в JSON:
// test/posts.test.js
test('POST /posts без токена возвращает 401', async (t) => {
const app = buildApp();
t.after(() => app.close());
const response = await app.inject({
method: 'POST',
url: '/posts',
payload: { title: 'Тест', body: 'Текст' },
});
assert.equal(response.statusCode, 401);
});Тест подтверждает, что защита из урока об авторизации работает.
Что есть в ответе
| Свойство | Что внутри |
|---|---|
response.statusCode | Код ответа |
response.headers | Заголовки ответа |
response.body | Тело строкой |
response.json() | Тело, разобранное из JSON |
Частая ошибка
Если не закрыть приложение после теста, открытая база и другие ресурсы плагинов могут не дать процессу завершиться, и npm test повиснет после вывода результатов. Кроме того, хуки onClose не выполнятся. Добавляйте t.after(() => app.close()) в каждый тест, который создаёт приложение.