Truthiness matchers

Truthiness matchers в Jasmine предназначены для проверки истинности или ложности значений в тестах. Они помогают убедиться, что переменные, выражения или функции возвращают ожидаемое логическое состояние. В основе этих матчеров лежат стандартные концепции Jav * aScript: truthy и falsy значения.


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

toBeTruthy()

toBeTruthy() проверяет, что значение является truthy, то есть в логическом контексте оно оценивается как true.

Примеры truthy значений в Jav * aScript:

  • Любые непустые строки: "hello", "0"
  • Числа, отличные от нуля: 1, -5, 3.14
  • Объекты и массивы, даже пустые: {}, []
  • true

Пример использования:

describe('Пример toBeTruthy', () => {
  it('проверяет truthy значение', () => {
    let value = 'Hello';
    expect(value).toBeTruthy();
  });
});

Если value будет пустой строкой, числом 0 или null, тест провалится.


toBeFalsy()

toBeFalsy() проверяет, что значение является falsy, то есть в логическом контексте оно оценивается как false.

Примеры falsy значений в Jav * aScript:

  • false
  • 0 и -0
  • "" (пустая строка)
  • null
  • undefined
  • NaN

Пример использования:

describe('Пример toBeFalsy', () => {
  it('проверяет falsy значение', () => {
    let value = 0;
    expect(value).toBeFalsy();
  });
});

Любое значение, которое не входит в список falsy, приведет к падению теста.


Отличие от toBe(true) и toBe(false)

toBeTruthy() и toBeFalsy() проверяют логическую природу значения, а не его точное сравнение. Например:

expect(1).toBeTruthy(); // пройдёт
expect(1).toBe(true);   // не пройдёт

Первое утверждение оценивает 1 как truthy, второе требует точного соответствия булевому true.


Сценарии использования

  • Проверка, что функция возвращает значение, которое можно использовать в условных операторах:
function isUserLoggedIn() {
  return 'token';
}
expect(isUserLoggedIn()).toBeTruthy();
  • Проверка отсутствия значения:
function getData() {
  return null;
}
expect(getData()).toBeFalsy();
  • Упрощение тестов на объекты или массивы:
let items = [1, 2, 3];
expect(items.length).toBeTruthy(); // длина массива > 0

Составные выражения с truthiness

Truthiness matchers часто используют с логическими операциями:

let a = 10;
let b = null;

expect(a && b).toBeFalsy();  // любое выражение с falsy результатом
expect(a || b).toBeTruthy(); // любое выражение с truthy результатом

Такой подход позволяет проверять логическое поведение выражений, а не конкретные значения.


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

  • Использовать toBeTruthy() и toBeFalsy() для логических проверок, а не для точного сравнения.
  • Для проверки конкретных значений использовать toBe() или toEqual().
  • Упрощают тесты на объекты и массивы, когда важно только, что они существуют и не пусты.
  • Позволяют делать тесты более читаемыми, особенно при проверке состояний флагов, наличия данных или результатов функций, возвращающих разнообразные типы значений.

Truthiness matchers — простой, но мощный инструмент для тестирования логических условий и состояния данных, позволяющий писать лаконичные и выразительные тесты в Jasmine.