Jasmine 5.x привнесла несколько значительных изменений в API и внутреннюю архитектуру фреймворка для тестирования. При переходе с версии 4.x на 5.x важно учитывать как изменения в синтаксисе, так и изменения в поведении библиотек и плагинов. Рассмотрим основные моменты, на которые следует обратить внимание при миграции.
Перед тем как приступить к миграции, необходимо обновить зависимости.
Наиболее актуальные изменения касаются jasmine-core,
jasmine и других плагинов. Если проект использует другие
связанные библиотеки, такие как karma-jasmine, они также
должны быть обновлены до последних версий, совместимых с Jasmine
5.x.
Для обновления зависимостей выполните следующие шаги:
npm install jasmine-core@^5.0.0
npm install jasmine@^5.0.0
Проверьте конфигурацию тестового окружения (например, Karma) на наличие возможных несовместимостей.
В Jasmine 5.x были удалены некоторые устаревшие глобальные объекты,
такие как jasmine.getEnv() и
jasmine.getGlobal(). Вместо этого теперь рекомендуется
использовать соответствующие методы из jasmine-core:
Для доступа к окружению тестов используйте
jasmine.getEnv() через импорт:
import { getEnv } from 'jasmine-core';
const env = getEnv();Для глобальных переменных, таких как beforeAll,
afterAll, beforeEach и afterEach,
необходимо использовать новые синтаксические конструкции в рамках
модульной системы.
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.
Асинхронные тесты в 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 улучшена работа с таймерами и отложенными тестами, что позволяет более надежно управлять асинхронными вызовами.
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();
});
В новой версии фреймворка некоторые методы были полностью удалены. Это касается функций, которые не были достаточно гибкими или нужными в контексте современных возможностей JavaScript и новых стандартов разработки.
Например, устаревшие функции:
jasmine.addMatchers() для кастомных матчеров.Все старые методы требуют внимательной проработки и адаптации к новой версии. При необходимости, кастомные матчеры можно будет переписать с использованием новых рекомендаций.
Если в проекте используются кастомные матчеры, важно переписать их с
учетом нового API. В Jasmine 5.x кастомные матчеры теперь создаются
через метод addMatchers().
Пример нового способа добавления кастомного матчера:
beforeEach(() => {
jasmine.addMatchers({
toBePositive: function () {
return {
compare: function (actual) {
return {
pass: actual > 0,
message: 'Expected ' + actual + ' to be positive'
};
}
};
}
});
});
Если в предыдущих версиях использовались другие подходы, потребуется переписать их, чтобы они соответствовали новой системе.
Jasmine 5.x внесла ряд изменений в документацию и примеры, которые теперь четче раскрывают работу с новыми возможностями фреймворка. Документация теперь включает разделы, посвященные миграции и совместимости с предыдущими версиями. Поэтому рекомендуется внимательно ознакомиться с обновленными мануалами и примерами использования.
Одной из значительных особенностей 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();
});
Эти изменения делают систему подписки на события более гибкой и удобной для работы с реальными приложениями.
При переходе на Jasmine 5.x необходимо проверить совместимость с другими инструментами, такими как Karma, Protractor или тестовыми движками, которые могут зависеть от конкретных версий Jasmine. Некоторые старые плагины и интеграции могут требовать обновления для полноценной работы с новой версией Jasmine.
Переход с Jasmine 4.x на 5.x требует внимания к изменениям в API, синтаксисе и внутренней структуре фреймворка. Важно протестировать все старые тесты, адаптировать кастомные матчеры и асинхронные тесты, а также обновить все зависимости для корректной работы с новой версией.