Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Тестирование: 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()) в каждый тест, который создаёт приложение.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.