Jasmine — популярная библиотека для тестирования кода на JavaScript. С выходом версии 4.x, разработчики столкнулись с рядом изменений и улучшений. Эти изменения могут повлиять на существующие тесты, и важно понимать, как правильно адаптировать старые проекты для новой версии.
Основные шаги для установки Jasmine 4.x такие же, как и для предыдущей версии, однако важно обратить внимание на несколько моментов:
Использование команд для установки пакетов:
npm install --save-dev jasmine@^4.0.0Возможно, потребуется обновить конфигурацию для работы с новым синтаксисом или улучшениями.
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');
toHaveBeenCalledWith и строгая типизацияМетод toHaveBeenCalledWith теперь поддерживает строгую
типизацию аргументов. Это означает, что он будет проверять, совпадают ли
аргументы, переданные в функцию, с теми, которые были указаны в
ожиданиях.
Jasmine 3.x:
expect(someFunction).toHaveBeenCalledWith('value');
Jasmine 4.x: В новой версии поведение остается похожим, однако типизация становится более строгой, что улучшает контроль за корректностью передаваемых значений и облегчает поиск ошибок.
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');
});
expectТеперь, в Jasmine 4.x, библиотека проводит более строгие проверки при
использовании expect(). Это касается как типов данных, так
и самих значений. Например, если ожидается объект, а передан примитив,
то тест завершится с ошибкой.
Jasmine 3.x:
expect('hello').toBeDefined();
Jasmine 4.x: Теперь передаваемые значения проверяются на соответствие ожидаемым типам данных, и при их несоответствии будет выброшена ошибка.
beforeAll и afterAllВ новой версии улучшены механизмы работы с глобальными хуками тестов,
такими как beforeAll() и afterAll(). Теперь,
если в этих хуках возникает ошибка, то тесты, использующие их, будут
корректно пропускаться, а не аварийно завершаться. В версии 3.x это было
несколько менее очевидно.
Jasmine 3.x:
beforeAll(() => {
throw new Error('Setup failed');
});
Jasmine 4.x: Ошибка в beforeAll теперь
не приведет к остановке всех тестов. Этот момент требует дополнительных
настроек для обеспечения корректного поведения в сложных сценариях.
Jasmine 4.x интегрирует дополнительные функции, схожие с теми, что есть в Jest, включая улучшенные матчер-функции. Это делает библиотеку более гибкой и удобной для использования в современных проектах.
Пример нового матчера:
expect([1, 2, 3]).toContain(2);
expect({name: 'John'}).toHaveProperty('name');
В версии 4.x расширена поддержка глобальных объектов, таких как
window, document и других. Теперь Jasmine
предоставляет встроенную настройку для работы с этими объектами в
браузерной среде, что упрощает тестирование фронтенд-приложений.
Для успешной миграции с Jasmine 3.x на 4.x необходимо пройти через несколько этапов:
Обновление зависимостей: Первым шагом будет
обновление зависимостей в package.json до версии Jasmine
4.x.
Обновление синтаксиса тестов: Следует заменить
устаревшие методы и обновить асинхронные тесты с использованием
async/await.
Проверка совместимости: Нужно тщательно протестировать существующие тесты на предмет их совместимости с новой версией. Особое внимание стоит уделить проверкам шпионов и моков, так как старые подходы могут не работать в новой версии.
Использование новых возможностей: После того как базовые тесты будут обновлены, можно начать использовать новые возможности, такие как новые матчера и улучшенную поддержку глобальных объектов.
Обновление до Jasmine 4.x приносит множество улучшений в области производительности, совместимости и удобства работы с асинхронным кодом. Одним из ключевых преимуществ является улучшенная поддержка типов, что позволяет избежать ошибок и повысить качество тестов. Также стоит отметить, что новые возможности, такие как Jest-подобные матчеры и улучшенная работа с глобальными объектами, делают библиотеку более мощной и удобной для разработчиков.