Encodera

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

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

Оглавление

Встроенный тестовый модуль

Автоматический тест — небольшая программа, которая вызывает ваш код и проверяет результат. Тесты запускают после каждого изменения: если что-то сломалось, вы узнаете сразу, а не от посетителей блога. В 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().

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

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