Numerical matchers

Numerical matchers — это специальные средства Jasmine для проверки числовых значений в тестах. Они позволяют сравнивать числа по точному значению, диапазону или относительной близости. Использование числовых матчеров повышает читаемость тестов и снижает вероятность ошибок при проверке чисел.


Основные числовые матчеры

toBe()

toBe() проверяет строгое равенство значений, аналогично оператору ===. При работе с числами используется для точного совпадения.

describe('toBe matcher', () => {
  it('проверяет точное равенство чисел', () => {
    const result = 10;
    expect(result).toBe(10);  // пройдёт
    expect(result).not.toBe(5); // пройдёт
  });
});

Особенности:

  • Проверка производится строго, без преобразования типов.
  • Используется для целых чисел или значений с фиксированной точностью.

toEqual()

toEqual() сравнивает значения с учётом структуры объектов и массивов, но для чисел работает аналогично toBe(). Отличие проявляется при сравнении сложных структур.

describe('toEqual matcher', () => {
  it('сравнивает числа и структуры', () => {
    expect(5).toEqual(5); // пройдёт
    expect([1, 2, 3]).toEqual([1, 2, 3]); // пройдёт
  });
});

Особенности:

  • Для чисел разницы с toBe() нет.
  • Предпочтительно использовать toEqual() при сравнении объектов с числовыми полями.

toBeGreaterThan() и toBeGreaterThanOrEqual()

Эти матчеры проверяют числовые значения на большее или равное условие.

describe('Сравнение чисел', () => {
  const value = 7;

  it('value больше 5', () => {
    expect(value).toBeGreaterThan(5); // пройдёт
  });

  it('value больше или равно 7', () => {
    expect(value).toBeGreaterThanOrEqual(7); // пройдёт
  });
});

Особенности:

  • Используются для проверки пороговых значений.
  • Особенно полезны при тестировании функций с динамическим числовым результатом, где точное значение заранее неизвестно.

toBeLessThan() и toBeLessThanOrEqual()

Эти матчеры являются обратными предыдущим и проверяют, что число меньше заданного значения или меньше либо равно ему.

describe('Сравнение чисел на меньшее', () => {
  const value = 3;

  it('value меньше 5', () => {
    expect(value).toBeLessThan(5); // пройдёт
  });

  it('value меньше или равно 3', () => {
    expect(value).toBeLessThanOrEqual(3); // пройдёт
  });
});

Особенности:

  • Идеальны для тестирования лимитов и граничных условий.
  • Часто применяются при проверке диапазонов чисел.

toBeCloseTo()

toBeCloseTo() используется для проверки чисел с плавающей запятой, где прямое сравнение может быть ненадёжным из-за особенностей представления чисел в JavaScript.

describe('Проверка чисел с плавающей запятой', () => {
  const result = 0.1 + 0.2;

  it('результат близок к 0.3', () => {
    expect(result).toBeCloseTo(0.3, 5); // пройдёт, точность до 5 знаков
  });
});

Особенности:

  • Второй параметр задаёт количество десятичных знаков точности.
  • Позволяет избежать ошибок сравнения из-за погрешностей арифметики с плавающей запятой.
  • Рекомендуется при работе с финансовыми и научными вычислениями.

Комбинирование числовых матчеров с логическими операторами

Jasmine позволяет комбинировать матчер с not для отрицания условия:

describe('Отрицание числового матчера', () => {
  const value = 10;

  it('value не меньше 5', () => {
    expect(value).not.toBeLessThan(5); // пройдёт
  });

  it('value не равно 5', () => {
    expect(value).not.toBe(5); // пройдёт
  });
});

Особенности:

  • not можно использовать с любым числовым матчером.
  • Повышает читаемость тестов при проверке отрицательных условий.

Практические рекомендации

  • Для целых чисел использовать toBe() или toEqual().
  • Для плавающей запятой всегда использовать toBeCloseTo().
  • Для проверки диапазоновtoBeGreaterThan(), toBeGreaterThanOrEqual(), toBeLessThan(), toBeLessThanOrEqual().
  • Использовать not для отрицательных условий вместо явного сравнения через if.

Пример комплексного теста

describe('Числовые проверки', () => {
  const score = 82.345;

  it('score в пределах нормы', () => {
    expect(score).toBeGreaterThan(80);
    expect(score).toBeLessThan(100);
  });

  it('score близок к ожидаемому значению', () => {
    expect(score).toBeCloseTo(82.34, 2);
  });

  it('score не равен минимальному значению', () => {
    expect(score).not.toBe(0);
  });
});

Такой подход делает тесты на числа ясными, точными и устойчивыми к изменениям реализации функций.