JS Advanced

Автоматическое тестирование (Mocha)

Понять основы тестирования: тест, assertion, test runner. Написать минимальный тест на Mocha.

Продвинутый (Advanced)

Кратко

Тестирование — проверка, что код работает правильно. describe — группа тестов. it — один тест. expect — проверка результата (assertion). Test runner запускает тесты и показывает результат. Здесь показан Mocha — это один из инструментов тестирования, но не единственный современный вариант: популярны также Jest и Vitest. Тестирование — отдельная инженерная дисциплина (engineering skill).


Подробно

Структура теста: describe('Math operations', () => { it('should add two numbers', () => { const result = 1 + 2; expect(result).to.equal(3); });

it('should handle negative numbers', () => { const result = -1 + -2; expect(result).to.equal(-3); }); });

Assertions (expect): expect(value).to.equal(expected); // strict equal expect(value).to.be.true; // boolean check expect(value).to.be.null; // null check expect(array).to.have.length(3); // length check expect(fn).to.throw(Error); // error check

Mocha + Chai (пример одного из инструментов; Jest и Vitest устроены похоже): // npm install mocha chai // package.json: "test": "mocha"

const { expect } = require('chai');

describe('User', () => { it('should create user with name', () => { const user = { name: 'Анна' }; expect(user.name).to.equal('Анна'); });

it('should have default role', () => { const user = { name: 'Анна', role: 'user' }; expect(user.role).to.equal('user'); }); });

Виды тестов:

  • Unit tests — проверка отдельных функций
  • Integration tests — проверка взаимодействия модулей
  • E2E tests — проверка пользовательского сценария

Тестирование — отдельная инженерная дисциплина. Этот урок даёт обзор, не глубину.


Ментальная модель

Тест — как контрольный чек-лист. Вы проверяете: «Работает ли функция правильно?» describe — категория чек-листа. it — один пункт. expect — проверка. Если все пункты пройдены — тест зелёный (pass). Если нет — красный (fail).


Примеры

**Самый простой:**

javascript
// Простейший тест
function add(a, b) {
  return a + b;
}

// Вместо console.log проверяем вручную:
console.assert(add(1, 2) === 3, '1+2 should be 3');
console.assert(add(0, 0) === 0, '0+0 should be 0');
console.log('All basic assertions passed');

Простейшая проверка через console.assert.

**Простой:**

javascript
// Mocha + Chai
const { expect } = require('chai');

describe('Array', () => {
  describe('.push()', () => {
    it('should add element to end', () => {
      const arr = [1, 2, 3];
      arr.push(4);
      expect(arr).to.deep.equal([1, 2, 3, 4]);
    });

    it('should increase length', () => {
      const arr = [1, 2];
      arr.push(3);
      expect(arr).to.have.length(3);
    });
  });
});

Mocha тест для встроенного метода массива.

**Реальный пример:**

javascript
// Реальный тест для функции
function formatPrice(amount, currency = 'RUB') {
  return new Intl.NumberFormat('ru-RU', {
    style: 'currency',
    currency
  }).format(amount);
}

describe('formatPrice', () => {
  it('should format RUB', () => {
    expect(formatPrice(1234.56)).to.equal('1 234,56 ₽');
  });

  it('should format USD', () => {
    expect(formatPrice(99.99, 'USD')).to.equal('$99.99');
  });

  it('should handle zero', () => {
    expect(formatPrice(0)).to.equal('0,00 ₽');
  });
});

Реальный тест: форматирование цен с разными валютами.


Частые ошибки

**Неправильно:** Писать тесты без проверки assertions

**Почему:** Тест без assertion ничего не проверяет — он всегда «проходит».

**Правильно:** В каждом it() должен быть expect() или assert.

**Неправильно:** Думать, что тестирование = 100% покрытие кода

**Почему:** Покрытие кода ≠ качество тестов. Тесты должны проверять поведение, а не каждую строку.

**Правильно:** Тестируйте поведение: «Что делает функция?» а не «Какую строку выполняет?»

**Неправильно:** Смешивать тесты и production код

**Почему:** Тесты не должны попадать в production bundle.

**Правильно:** Тесты в отдельных файлах (.test.js, .spec.js).


Важно запомнить

  • describe — группа тестов
  • it — один тест
  • expect/assert — проверка результата
  • Тесты = проверка поведения, а не строк кода
  • Testing — отдельная инженерная дисциплина

Связь

Назад: Вы знаете функции (J9) и модули (J25). Тестирование объединяет их для обеспечения качества.

Вперёд: Вы прошли весь учебный план PROlab Academy! 🎉


Читайте дальше

Материалы курса JS Advanced — PROlab Academy.