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

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

1. Обновление зависимостей

Перед тем как приступить к миграции, необходимо обновить зависимости. Наиболее актуальные изменения касаются jasmine-core, jasmine и других плагинов. Если проект использует другие связанные библиотеки, такие как karma-jasmine, они также должны быть обновлены до последних версий, совместимых с Jasmine 5.x.

Для обновления зависимостей выполните следующие шаги:

npm install jasmine-core@^5.0.0
npm install jasmine@^5.0.0

Проверьте конфигурацию тестового окружения (например, Karma) на наличие возможных несовместимостей.

2. Изменения в глобальных объектах

В Jasmine 5.x были удалены некоторые устаревшие глобальные объекты, такие как jasmine.getEnv() и jasmine.getGlobal(). Вместо этого теперь рекомендуется использовать соответствующие методы из jasmine-core:

  • Для доступа к окружению тестов используйте jasmine.getEnv() через импорт:

    import { getEnv } from 'jasmine-core';
    const env = getEnv();
  • Для глобальных переменных, таких как beforeAll, afterAll, beforeEach и afterEach, необходимо использовать новые синтаксические конструкции в рамках модульной системы.

3. Актуализация синтаксиса матчеров

Jasmine 5.x представила обновленный синтаксис для некоторых матчеров. Например, toBe() теперь имеет улучшенную поддержку работы с объектами и функциями. Для работы с асинхронными тестами был улучшен матчинг с использованием async/await.

Пример:

В Jasmine 4.x:

expect(value).toBe(expected);

В Jasmine 5.x, если value и expected — это асинхронные операции:

expect(await value).toBe(expected);

Если тесты используют устаревшие методы, такие как toEqual() для сравнения объектов, рекомендуется обновить их в соответствии с новым API.

4. Изменения в работе с асинхронностью

Асинхронные тесты в Jasmine 5.x требуют соблюдения новых правил для работы с промисами и async/await. Вместо использования done() для завершения асинхронных тестов, теперь рекомендуется работать с async/await.

Пример:

it('should return the correct data', async () => {
  const result = await fetchData();
  expect(result).toEqual(expected);
});

Кроме того, в Jasmine 5.x улучшена работа с таймерами и отложенными тестами, что позволяет более надежно управлять асинхронными вызовами.

5. Поддержка новых типов тестов

Jasmine 5.x добавила поддержку дополнительных типов тестов, таких как spyOn() для работы с моками и шпионами. В новой версии улучшена поддержка тестирования асинхронных и многопоточных операций.

Пример использования spyOn в Jasmine 5.x:

it('should call the callback', async () => {
  const callback = jasmine.createSpy('callback');
  await fetchData(callback);
  expect(callback).toHaveBeenCalled();
});

6. Удаление устаревших методов

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

Например, устаревшие функции:

  • jasmine.addMatchers() для кастомных матчеров.
  • Старые методы для работы с глобальными состояниями, которые были заменены более удобными и безопасными вариантами.

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

7. Миграция кастомных матчеров

Если в проекте используются кастомные матчеры, важно переписать их с учетом нового API. В Jasmine 5.x кастомные матчеры теперь создаются через метод addMatchers().

Пример нового способа добавления кастомного матчера:

beforeEach(() => {
  jasmine.addMatchers({
    toBePositive: function () {
      return {
        compare: function (actual) {
          return {
            pass: actual > 0,
            message: 'Expected ' + actual + ' to be positive'
          };
        }
      };
    }
  });
});

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

8. Обновления в документации

Jasmine 5.x внесла ряд изменений в документацию и примеры, которые теперь четче раскрывают работу с новыми возможностями фреймворка. Документация теперь включает разделы, посвященные миграции и совместимости с предыдущими версиями. Поэтому рекомендуется внимательно ознакомиться с обновленными мануалами и примерами использования.

9. Переход на новые методы для работы с событями

Одной из значительных особенностей Jasmine 5.x является улучшение работы с событиями и подписками на них. Вместо старых методов, таких как jasmine.getEnv().currentSpec, теперь рекомендуется использовать новые интерфейсы для отслеживания событий:

it('should listen to events properly', async () => {
  const eventEmitter = new EventEmitter();
  const listener = jasmine.createSpy('listener');
  eventEmitter.on('event', listener);
  eventEmitter.emit('event');
  expect(listener).toHaveBeenCalled();
});

Эти изменения делают систему подписки на события более гибкой и удобной для работы с реальными приложениями.

10. Совместимость с другими инструментами

При переходе на Jasmine 5.x необходимо проверить совместимость с другими инструментами, такими как Karma, Protractor или тестовыми движками, которые могут зависеть от конкретных версий Jasmine. Некоторые старые плагины и интеграции могут требовать обновления для полноценной работы с новой версией Jasmine.

Заключение

Переход с Jasmine 4.x на 5.x требует внимания к изменениям в API, синтаксисе и внутренней структуре фреймворка. Важно протестировать все старые тесты, адаптировать кастомные матчеры и асинхронные тесты, а также обновить все зависимости для корректной работы с новой версией.