
Функцию очков любительской лиги удобно тестировать отдельно от таблицы на странице. Сначала нужно записать правила. Для учебного примера договоримся: за победу три очка, за ничью по одному, за поражение ноль. Это условный регламент, а не утверждение о правилах любого реального турнира.
Функция очков и отдельный запускаемый тест
points.mjs
export function pointsFor(home, away) {
if (![home, away].every(x => Number.isInteger(x) && x >= 0)) {
throw new TypeError('Счёт должен состоять из неотрицательных целых');
}
if (home === away) return [1, 1];
return home > away ? [3, 0] : [0, 3];
}
test.mjs
import assert from 'node:assert/strict';
import { pointsFor } from './points.mjs';
assert.deepEqual(pointsFor(2, 0), [3, 0]);
assert.deepEqual(pointsFor(0, 2), [0, 3]);
assert.deepEqual(pointsFor(0, 0), [1, 1]);
assert.deepEqual(pointsFor(3, 3), [1, 1]);
for (const pair of [[-1, 0], [1.5, 0], ['2', 0], [NaN, 1]]) {
assert.throws(() => pointsFor(...pair), TypeError);
}
console.log('Проверки пройдены');
Сохраните файлы рядом и выполните node test.mjs. Используется встроенный node:assert/strict, отдельный пакет не нужен. Официальная документация Node описывает строгий режим сравнений; в нём строка и число не должны незаметно считаться одинаковыми. При нарушении ожидания команда завершится ошибкой, а не только напечатает сообщение.
| Что сравнить | На что смотреть | Что сделать |
|---|---|---|
| Победа хозяев | Проверка первой ветки | Ожидаются [3, 0] |
| Победа гостей | Проверка симметрии | Ожидаются [0, 3] |
| Ничья | Нулевая и ненулевая | Ожидаются [1, 1] |
| Неверный ввод | Дробь, строка, отрицательное и NaN | Ожидается исключение |
Не тестируйте только удобный счёт
Один тест 2:0 не обнаружит ошибку ничьей или перепутанные позиции. Проверяйте смысловые группы и границы. Добавить тысячу похожих побед хозяев менее полезно, чем покрыть гостевую победу и неверный тип. При изменении регламента сначала обновите явно сформулированное правило и ожидания, затем код.
- Проверить обе стороны победы.
- Отдельно проверить нулевую ничью.
- Отклонить нецелые и нечисловые значения.
- Не делать DOM обязательным условием вычислительного теста.
Эта функция не строит полную турнирную таблицу. Здесь нет снятий команд, штрафных очков, технических результатов и критериев равенства. В реальной лиге их определяет подтверждённый регламент. Не добавляйте скрытые правила в функцию из личного опыта другого соревнования.
Вопросы и ответы
Почему массив, а не сумма очков?
Нужно сохранить результат для каждой стороны. Контракт возвращает две позиции в известном порядке.
Зачем проверять строки?
Данные из форм часто приходят строками. Преобразование должно быть явным отдельным шагом, а не случайным приведением.
Тесты доказывают правильность всего сайта?
Нет. Они проверяют конкретный контракт функции. Вывод таблицы и получение данных требуют своих проверок.
Нужно ли внешнее тестовое окружение?
Для этого маленького примера достаточно Node и встроенных assertions. Более сложные сценарии могут потребовать другого инструмента.
Источники: nodejs.org.




