Функция expect

Функция expect является ключевым элементом тестирования в Jasmine. Она используется для проверки значений и определения того, соответствует ли фактический результат ожидаемому. Все утверждения в Jasmine строятся вокруг вызова expect, который возвращает объект с набором матчеров (matchers), позволяющих задавать различные условия проверки.


Основной синтаксис

expect(actualValue).toBe(expectedValue);
  • actualValue — фактическое значение, полученное в ходе выполнения теста.
  • expectedValue — значение, с которым производится сравнение.
  • toBe — один из стандартных матчеров Jasmine, проверяющий строгое равенство (===).

Пример:

describe("Проверка чисел", function() {
  it("должна подтверждать равенство чисел", function() {
    const result = 5;
    expect(result).toBe(5);
  });
});

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

Jasmine предоставляет разнообразные матчеры, которые делятся на несколько категорий:

1. Проверка равенства и типов

  • toBe(value) — строгая проверка равенства (===).
  • toEqual(value) — проверка структурного равенства объектов или массивов.
  • toBeTruthy() — проверка, что значение истинно.
  • toBeFalsy() — проверка, что значение ложно.
  • toBeNull() — проверка на null.
  • toBeUndefined() — проверка на undefined.
  • toBeNaN() — проверка на NaN.
expect({a: 1}).toEqual({a: 1});
expect(true).toBeTruthy();
expect(null).toBeNull();

2. Числовые проверки

  • toBeGreaterThan(number) — проверяет, что значение больше числа.
  • toBeLessThan(number) — проверяет, что значение меньше числа.
  • toBeCloseTo(number, precision) — проверка чисел с плавающей точкой с заданной точностью.
expect(10).toBeGreaterThan(5);
expect(3.1415).toBeCloseTo(3.14, 2);

3. Проверка строк

  • toMatch(regexp) — проверка строки на соответствие регулярному выражению.
expect("Hello World").toMatch(/World/);

4. Проверка массивов и объектов

  • toContain(item) — проверка наличия элемента в массиве.
  • toHaveBeenCalled() — проверка вызова функции-шпиона.
  • toHaveBeenCalledWith(...args) — проверка вызова функции с конкретными аргументами.
const spy = jasmine.createSpy('myFunction');
spy('test');
expect(spy).toHaveBeenCalled();
expect(spy).toHaveBeenCalledWith('test');

Отрицание проверок

Все матчеры могут использоваться с отрицанием через .not, что позволяет проверять обратные условия:

expect(5).not.toBe(10);
expect([1,2,3]).not.toContain(4);
expect(null).not.toBeTruthy();

Отрицание .not можно комбинировать с любым матчером, расширяя гибкость тестирования.


Работа с асинхронными операциями

expect можно использовать вместе с асинхронными тестами через async/await или колбэки, что особенно важно при работе с промисами.

it("должен получить данные с сервера", async function() {
  const data = await fetchData();
  expect(data).toBeDefined();
  expect(data.length).toBeGreaterThan(0);
});

При использовании Jasmine версии 3 и выше также доступна функция done для синхронизации завершения асинхронных операций:

it("асинхронный тест с done", function(done) {
  setTimeout(function() {
    expect(true).toBe(true);
    done();
  }, 100);
});

Кастомные матчеры

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

beforeEach(function() {
  jasmine.addMatchers({
    toBeEven: function() {
      return {
        compare: function(actual) {
          const result = {};
          result.pass = (actual % 2 === 0);
          result.message = result.pass ? `${actual} является чётным` : `${actual} не является чётным`;
          return result;
        }
      };
    }
  });
});

it("проверка на четность", function() {
  expect(4).toBeEven();
  expect(5).not.toBeEven();
});

Создание кастомных матчеров позволяет сократить повторяющийся код и сделать тесты более читабельными и выразительными.


Советы по использованию expect

  • Использовать точные матчеры для конкретных проверок (toBe для примитивов, toEqual для объектов).
  • При асинхронных операциях обязательно учитывать завершение промисов или использовать async/await.
  • Комбинировать .not с матчерами для проверки обратных условий.
  • Применять кастомные матчеры для часто повторяющихся проверок и специфических бизнес-условий.

Функция expect в Jasmine формирует основу всего процесса тестирования, позволяя проверять значения, поведение функций и асинхронные операции с высокой точностью и наглядностью. Ее гибкость и расширяемость делают тесты более структурированными и читаемыми, а использование правильных матчеров существенно повышает качество тестового покрытия.