Миграция с Jasmine 3.x на 4.x

Jasmine — популярная библиотека для тестирования кода на JavaScript. С выходом версии 4.x, разработчики столкнулись с рядом изменений и улучшений. Эти изменения могут повлиять на существующие тесты, и важно понимать, как правильно адаптировать старые проекты для новой версии.

1. Установка и настройка

Основные шаги для установки Jasmine 4.x такие же, как и для предыдущей версии, однако важно обратить внимание на несколько моментов:

  • Использование команд для установки пакетов:

    npm install --save-dev jasmine@^4.0.0
  • Возможно, потребуется обновить конфигурацию для работы с новым синтаксисом или улучшениями.

2. Изменения в API

2.1. spyOn теперь всегда работает с функциями

В Jasmine 3.x можно было создавать шпионов на объекты, методы которых были не функциями, например, на свойства объектов. В версии 4.x такой подход больше не поддерживается.

Jasmine 3.x:

const obj = { prop: 'value' };
spyOn(obj, 'prop');

Jasmine 4.x: В новой версии шпионы могут быть созданы только на функциях. Если попытаться создать шпион на свойстве, произойдёт ошибка. Чтобы работать с такими объектами, нужно использовать вспомогательные функции или обёртки.

const obj = { prop: () => 'value' };  // Теперь это функция
spyOn(obj, 'prop');
2.2. toHaveBeenCalledWith и строгая типизация

Метод toHaveBeenCalledWith теперь поддерживает строгую типизацию аргументов. Это означает, что он будет проверять, совпадают ли аргументы, переданные в функцию, с теми, которые были указаны в ожиданиях.

Jasmine 3.x:

expect(someFunction).toHaveBeenCalledWith('value');

Jasmine 4.x: В новой версии поведение остается похожим, однако типизация становится более строгой, что улучшает контроль за корректностью передаваемых значений и облегчает поиск ошибок.

2.3. Обновление done для асинхронных тестов

Использование done() в асинхронных тестах теперь требует более чёткой структуры. В Jasmine 3.x done() использовался для явного завершения асинхронного теста, но в версии 4.x это стало более строгим.

Jasmine 3.x:

it('should return value after async operation', (done) => {
  someAsyncFunction().then(result => {
    expect(result).toBe('expected value');
    done();
  });
});

Jasmine 4.x: В версии 4.x рекомендуется использовать async/await вместо done(). Это позволяет избежать лишнего кода и сделать тесты более читаемыми.

it('should return value after async operation', async () => {
  const result = await someAsyncFunction();
  expect(result).toBe('expected value');
});
2.4. Строгие проверки expect

Теперь, в Jasmine 4.x, библиотека проводит более строгие проверки при использовании expect(). Это касается как типов данных, так и самих значений. Например, если ожидается объект, а передан примитив, то тест завершится с ошибкой.

Jasmine 3.x:

expect('hello').toBeDefined();

Jasmine 4.x: Теперь передаваемые значения проверяются на соответствие ожидаемым типам данных, и при их несоответствии будет выброшена ошибка.

2.5. Обновления в работе с beforeAll и afterAll

В новой версии улучшены механизмы работы с глобальными хуками тестов, такими как beforeAll() и afterAll(). Теперь, если в этих хуках возникает ошибка, то тесты, использующие их, будут корректно пропускаться, а не аварийно завершаться. В версии 3.x это было несколько менее очевидно.

Jasmine 3.x:

beforeAll(() => {
  throw new Error('Setup failed');
});

Jasmine 4.x: Ошибка в beforeAll теперь не приведет к остановке всех тестов. Этот момент требует дополнительных настроек для обеспечения корректного поведения в сложных сценариях.

3. Новые возможности и улучшения

3.1. Поддержка Jest-подобных матчеров

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

Пример нового матчера:

expect([1, 2, 3]).toContain(2);
expect({name: 'John'}).toHaveProperty('name');
3.2. Расширенная поддержка глобальных объектов

В версии 4.x расширена поддержка глобальных объектов, таких как window, document и других. Теперь Jasmine предоставляет встроенную настройку для работы с этими объектами в браузерной среде, что упрощает тестирование фронтенд-приложений.

4. Миграция к новой версии

Для успешной миграции с Jasmine 3.x на 4.x необходимо пройти через несколько этапов:

  1. Обновление зависимостей: Первым шагом будет обновление зависимостей в package.json до версии Jasmine 4.x.

  2. Обновление синтаксиса тестов: Следует заменить устаревшие методы и обновить асинхронные тесты с использованием async/await.

  3. Проверка совместимости: Нужно тщательно протестировать существующие тесты на предмет их совместимости с новой версией. Особое внимание стоит уделить проверкам шпионов и моков, так как старые подходы могут не работать в новой версии.

  4. Использование новых возможностей: После того как базовые тесты будут обновлены, можно начать использовать новые возможности, такие как новые матчера и улучшенную поддержку глобальных объектов.

5. Преимущества миграции

Обновление до Jasmine 4.x приносит множество улучшений в области производительности, совместимости и удобства работы с асинхронным кодом. Одним из ключевых преимуществ является улучшенная поддержка типов, что позволяет избежать ошибок и повысить качество тестов. Также стоит отметить, что новые возможности, такие как Jest-подобные матчеры и улучшенная работа с глобальными объектами, делают библиотеку более мощной и удобной для разработчиков.