Пошук уроків, статей та іншого контенту
Додасте програмні перевірки передумов і результатів за допомогою assert та зрозумієте типові помилки тверджень.
assertassert — це вбудований модуль Node.js для програмних перевірок. Він перевіряє, чи справджується певна умова:
якщо умова правильна, програма продовжує виконання;
якщо умова неправильна, Node.js викидає помилку AssertionError.
Твердження корисні, коли потрібно перевірити:
передумови перед виконанням функції;
результати роботи функції;
припущення, на яких побудований код;
поведінку невеликих частин програми.
Підключити строгий варіант модуля можна так:
const assert = require('node:assert/strict');Варіант node:assert/strict використовує суворі перевірки. Наприклад, число 5 не вважається рівним рядку '5'.
Метод assert.ok() перевіряє, чи є значення істинним.
const assert = require('node:assert/strict');
assert.ok(true);
assert.ok(10 > 3);
console.log('Усі перевірки пройдено');У JavaScript до істинних значень належать, зокрема:
true;
ненульові числа;
непорожні рядки;
об’єкти та масиви.
До хибних значень належать:
false;
0;
'';
null;
undefined;
NaN.
Наприклад:
const assert = require('node:assert/strict');
assert.ok('Node.js');
assert.ok([1, 2, 3]);
console.log('Перевірки пройдено');Якщо передати хибне значення, виникне помилка:
const assert = require('node:assert/strict');
assert.ok(false);
console.log('Цей рядок не виконається');Node.js зупинить виконання на твердженні й покаже AssertionError.
assert.strictEqual()Метод assert.strictEqual(actual, expected) порівнює два значення за строгими правилами, подібно до оператора ===.
const assert = require('node:assert/strict');
const total = 2 + 3;
assert.strictEqual(total, 5);
console.log('Сума правильна');У твердженні:
actual — фактичне значення, отримане програмою;
expected — очікуване значення.
const assert = require('node:assert/strict');
const userName = 'Olena';
assert.strictEqual(userName, 'Olena');Типи також мають значення:
const assert = require('node:assert/strict');
assert.strictEqual(5, '5');Ця перевірка завершиться помилкою, оскільки число 5 і рядок '5' мають різні типи.
Для порівняння не використовують assert.equal(), якщо потрібна однозначна перевірка. У строгому режимі краще явно застосовувати strictEqual.
assert.deepStrictEqual()Об’єкти й масиви порівнюють за вмістом за допомогою assert.deepStrictEqual().
const assert = require('node:assert/strict');
const actualUser = {
name: 'Olena',
age: 25
};
const expectedUser = {
name: 'Olena',
age: 25
};
assert.deepStrictEqual(actualUser, expectedUser);
console.log('Дані користувача правильні');Звичайне strictEqual() порівнює об’єкти за посиланням:
const assert = require('node:assert/strict');
const first = { value: 10 };
const second = { value: 10 };
assert.strictEqual(first, second);Це твердження завершиться помилкою. Об’єкти мають однаковий вміст, але це два різні об’єкти в пам’яті.
Для порівняння структури та значень потрібно використовувати deepStrictEqual():
const assert = require('node:assert/strict');
const first = { value: 10 };
const second = { value: 10 };
assert.deepStrictEqual(first, second);Третій аргумент методів assert — це повідомлення, яке допомагає зрозуміти причину помилки.
const assert = require('node:assert/strict');
const age = 15;
assert.ok(
age >= 18,
'Користувач має бути повнолітнім'
);Якщо перевірка не пройде, повідомлення з’явиться разом із помилкою.
Повідомлення особливо корисні, коли у програмі багато тверджень:
const assert = require('node:assert/strict');
const result = 2 * 4;
assert.strictEqual(
result,
8,
'Результат множення має дорівнювати 8'
);Передумова — це умова, яка має бути виконана до початку роботи функції.
Наприклад, функція для обчислення зниженої ціни очікує:
ціну, більшу за нуль;
знижку від 0 до 100.
const assert = require('node:assert/strict');
function calculateDiscountedPrice(price, discountPercent) {
assert.ok(
price > 0,
'Ціна має бути більшою за нуль'
);
assert.ok(
discountPercent >= 0 && discountPercent <= 100,
'Знижка має бути від 0 до 100 відсотків'
);
return price * (1 - discountPercent / 100);
}
const result = calculateDiscountedPrice(100, 20);
assert.strictEqual(result, 80);
console.log(`Ціна зі знижкою: ${result}`);У цьому прикладі:
assert.ok(price > 0) перевіряє коректність ціни.
Друге твердження перевіряє діапазон знижки.
assert.strictEqual(result, 80) перевіряє результат функції.
Якщо передати неправильні дані, функція завершиться помилкою ще до обчислення:
const assert = require('node:assert/strict');
function calculateDiscountedPrice(price, discountPercent) {
assert.ok(price > 0, 'Ціна має бути більшою за нуль');
assert.ok(
discountPercent >= 0 && discountPercent <= 100,
'Знижка має бути від 0 до 100 відсотків'
);
return price * (1 - discountPercent / 100);
}
calculateDiscountedPrice(100, 120);Це допомагає швидко виявити помилку в місці, де було порушено очікування.
Після виклику функції можна перевірити, що вона повернула правильне значення.
const assert = require('node:assert/strict');
function getFullName(firstName, lastName) {
return `${firstName} ${lastName}`;
}
const fullName = getFullName('Olena', 'Koval');
assert.strictEqual(
fullName,
'Olena Koval',
'Повне ім’я сформовано неправильно'
);
console.log(fullName);Такі перевірки особливо корисні для функцій, які виконують обчислення або перетворюють дані.
Повний приклад із кількома перевірками:
const assert = require('node:assert/strict');
function createProduct(name, price) {
assert.ok(name.length > 0, 'Назва товару не може бути порожньою');
assert.ok(price >= 0, 'Ціна не може бути від’ємною');
return {
name,
price
};
}
const product = createProduct('Клавіатура', 1500);
assert.deepStrictEqual(
product,
{
name: 'Клавіатура',
price: 1500
},
'Об’єкт товару сформовано неправильно'
);
console.log('Товар створено:', product);Збережіть код у файлі app.js і запустіть:
node app.jsЯкщо всі твердження правильні, програма виведе:
Товар створено: { name: 'Клавіатура', price: 1500 }Якщо твердження не виконується, Node.js показує помилку приблизно такого вигляду:
AssertionError [ERR_ASSERTION]: Ціна має бути більшою за нульВажливі частини помилки:
AssertionError — тип помилки, створеної невдалим твердженням;
повідомлення після двокрапки — пояснення, яке ви передали в assert;
стек викликів — місце в коді, де сталася помилка.
Наприклад:
const assert = require('node:assert/strict');
const expected = 10;
const actual = 8;
assert.strictEqual(
actual,
expected,
'Фактичне значення не збігається з очікуваним'
);Під час діагностики потрібно порівняти фактичне та очікуване значення. Помилка не означає, що зламався сам assert. Вона означає, що код отримав не той результат або було порушено передумову.
Іноді потрібно перевірити не успішний результат, а те, що функція правильно відхиляє неправильні дані. Для цього використовують assert.throws().
const assert = require('node:assert/strict');
function divide(a, b) {
assert.notStrictEqual(b, 0, 'Дільник не може дорівнювати нулю');
return a / b;
}
assert.throws(
() => divide(10, 0),
{
name: 'AssertionError',
message: 'Дільник не може дорівнювати нулю'
}
);
assert.strictEqual(divide(10, 2), 5);
console.log('Усі перевірки ділення пройдено');У assert.throws() передають:
функцію, яка має завершитися помилкою;
очікувані характеристики помилки.
Функцію передають без виклику:
() => divide(10, 0)Якщо написати divide(10, 0) без стрілкової функції, виклик відбудеться одразу, ще до того, як assert.throws() почне перевірку.
strictEqual() для об’єктівconst assert = require('node:assert/strict');
assert.strictEqual(
{ name: 'Anna' },
{ name: 'Anna' }
);Це помилка, бо об’єкти порівнюються за посиланням. Для порівняння вмісту використовуйте deepStrictEqual().
const assert = require('node:assert/strict');
assert.strictEqual(100, '100');Число та рядок — різні типи. Переконайтеся, що фактичне та очікуване значення мають потрібні типи.
const assert = require('node:assert/strict');
const result = [];
assert.ok(result);Порожній масив є істинним значенням, тому ця перевірка пройде. Але вона не перевіряє, чи містить масив елементи.
Якщо потрібно перевірити вміст, сформулюйте конкретне твердження:
const assert = require('node:assert/strict');
const result = [];
assert.strictEqual(
result.length,
0,
'Масив має бути порожнім'
);Методи порівняння приймають спочатку фактичне значення, потім очікуване:
assert.strictEqual(actual, expected);Дотримання цього порядку робить повідомлення про помилку зрозумілішими.
assert.throws()Неправильно:
assert.throws(divide(10, 0));Правильно:
assert.throws(() => divide(10, 0));У правильному варіанті assert.throws() отримує функцію й може самостійно перевірити її помилку.
assert і перевірка введених данихassert добре підходить для перевірки припущень усередині програми та під час розробки.
Для даних, які надходять від користувача або з мережі, зазвичай потрібно обробляти помилку так, щоб програма могла показати зрозуміле повідомлення й продовжити роботу. Невдале твердження одразу викидає помилку.
Наприклад, assert доречний для внутрішньої передумови:
const assert = require('node:assert/strict');
function getFirstItem(items) {
assert.ok(Array.isArray(items), 'Очікується масив');
return items[0];
}
assert.strictEqual(getFirstItem(['a', 'b']), 'a');
console.log('Перевірку пройдено');Головна ідея: твердження фіксує очікування програми й одразу повідомляє, якщо це очікування порушене.
assert — вбудований модуль Node.js для програмних перевірок.
assert.ok(value) перевіряє, чи є значення істинним.
assert.strictEqual(actual, expected) порівнює прості значення за допомогою строгого порівняння.
assert.deepStrictEqual(actual, expected) порівнює об’єкти й масиви за структурою та значеннями.
Третій аргумент твердження може містити зрозуміле повідомлення про помилку.
Твердження можна використовувати для перевірки передумов і результатів.
assert.throws() перевіряє, що певний виклик викидає очікувану помилку.
Порожній масив або об’єкт є істинними значеннями, тому assert.ok() не завжди перевіряє потрібний вміст.
Для об’єктів потрібно використовувати deepStrictEqual(), а для простих значень — strictEqual().