Встроенный тестовый модуль
Автоматический тест — небольшая программа, которая вызывает ваш код и проверяет результат. Тесты запускают после каждого изменения: если что-то сломалось, вы узнаете сразу, а не от посетителей блога. В Node.js для этого есть встроенные модули node:test (запуск тестов) и node:assert (проверки), ставить ничего не нужно.
Первый тест
Функция test() принимает название и функцию с проверками. assert.equal() сравнивает фактическое значение с ожидаемым:
import { test } from 'node:test';
import assert from 'node:assert/strict';
function slugify(title) {
return title.toLowerCase().trim().replace(/\s+/g, '-');
}
test('заменяет пробелы дефисами', () => {
assert.equal(slugify('Hello Node js'), 'hello-node-js');
});
test('убирает пробелы по краям', () => {
assert.equal(slugify(' Blog '), 'blog');
});Запустите файл командой node: в терминале появится отчёт с двумя галочками и строкой pass 2. Если проверка не пройдёт, отчёт покажет ожидаемое и фактическое значения, а программа вернёт код 1.
Код и тесты в разных файлах
В проекте функция живёт в src/slugify.js:
// src/slugify.js
export function slugify(title) {
return title.toLowerCase().trim().replace(/\s+/g, '-');
}А тесты — в папке test, в файле с окончанием .test.js:
// test/slugify.test.js
import { test } from 'node:test';
import assert from 'node:assert/strict';
import { slugify } from '../src/slugify.js';
test('заменяет пробелы дефисами', () => {
assert.equal(slugify('Hello Node js'), 'hello-node-js');
});Запуск всех тестов
Флаг --test сам находит файлы с именами вида *.test.js во всех папках проекта и запускает их:
node --testДобавьте его в package.json, чтобы запускать привычной командой npm test:
{
"scripts": {
"test": "node --test"
}
}С флагом --watch тесты перезапускаются при каждом сохранении: node --test --watch.
Проверки
| Проверка | Что сравнивает |
|---|---|
assert.equal(a, b) | Значения, строго через === |
assert.deepEqual(a, b) | Объекты и массивы по содержимому |
assert.ok(value) | Что значение истинно |
assert.throws(fn) | Что функция бросает ошибку |
await assert.rejects(promise) | Что промис отклоняется |
Асинхронный тест
Если код асинхронный, функцию теста объявляют async и ждут результат:
import { test } from 'node:test';
import assert from 'node:assert/strict';
import { readFile, writeFile } from 'node:fs/promises';
test('статьи сохраняются в JSON', async () => {
await writeFile('posts-test.json', JSON.stringify([{ id: 1, title: 'Привет' }]));
const posts = JSON.parse(await readFile('posts-test.json', 'utf8'));
assert.deepEqual(posts, [{ id: 1, title: 'Привет' }]);
});Частая ошибка
Два объекта с одинаковым содержимым — разные объекты, поэтому assert.equal() их не считает равными:
import assert from 'node:assert/strict';
assert.deepEqual({ id: 1 }, { id: 1 }); // проходит
console.log('deepEqual сравнивает содержимое');
// assert.equal({ id: 1 }, { id: 1 }) упал бы с ошибкойДля объектов и массивов используйте assert.deepEqual().