Первым шагом является понимание того, как работает Emotion. В отличие от статических классов вроде `"button primary"`, Emotion генерирует уникальные имена классов на лету, например, `"css-1a2b3c4d"`. Эти классы динамически вставляются в `` тег в head документа. Стили могут зависеть от пропсов (props) компонента, состояния (state) или глобальной темы (Theme). Поэтому традиционный поиск по фиксированному классу в селекторе (`.button`) обречён на провал. Тестировщик должен переходить на поиск по семантическим признакам: типу элемента, атрибутам, структуре DOM и, что важно, по фактическим CSS-свойствам.
Базовый инструмент для исследования — браузерные DevTools. Откройте вкладку "Elements" и инспектируйте интересующий элемент. Вы увидите сгенерированный класс (например, `class="css-123abc"`). Перейдя во вкладку "Styles", вы можете просмотреть все применённые к элементу CSS-правила, включая те, что были добавлены Emotion. Ключевой лайфхак: Emotion добавляет специальный атрибут `data-emotion` к тегам ``, а сгенерированные классы содержат хэш. Это помогает отличить их от других стилей. Для проверки динамического изменения стилей (например, при наведении или изменении пропса) используйте панель "Styles", меняя состояние элемента через `:hover` в инструменте состояния или модифицируя пропсы через React DevTools.
Написание автотестов (e2e на Cypress/Selenium или компонентных на Testing Library) требует особого подхода. Прямые селекторы по классу — антипаттерн. Вместо этого используйте:
- Селекторы по тесту и роли (приоритетный способ). Обеспечьте, чтобы разработчики добавляли доступные атрибуты: `data-testid="submit-button"` или правильные ARIA-роли (`role="button"`, `aria-label`). Это самый стабильный метод.
- Селекторы по иерархии и типу. Например, в Cypress: `cy.get('nav').find('button').contains('Save')`.
- Проверка стилей. Иногда нужно утверждать (assert), что элемент имеет конкретные CSS-свойства. В Cypress это делается так: `cy.get('[data-testid="my-button"]').should('have.css', 'background-color', 'rgb(0, 100, 255)')`. Важно: проверяйте вычисленные (computed) свойства, а не инлайн-стили.
Шаг для продвинутых сценариев — тестирование тем (Theming). Emotion часто используется вместе с провайдером темы. Вам нужно проверять, что при смене темы (например, с light на dark) у всех компонентов меняются соответствующие цвета, шрифты и т.д. В e2e-тесте это может имитироваться переключением чекбокса или вызовом функции контекста. После действия необходимо делать утверждения (asserts) на ключевые свойства, например, `background-color` и `color` для основных контейнеров. В компонентных тестах можно рендерить компонент с разными провайдерами темы и сравнивать снапшоты.
Особый вызов — тестирование динамических и условных стилей. Компонент может менять цвет в зависимости от статуса (`status="error"`). Стратегия тестирования:
- Управляйте пропсом компонента (в компонентных тестах) или состоянием приложения (в e2e).
- Находите элемент по стабильному селектору (`data-testid`).
- Проверяйте, что ожидаемое CSS-свойство применилось: `should('have.css', 'border-color', 'rgb(211, 47, 47)')`.
Наконец, интеграция в процесс. Внесите в чек-лист команды пункты, связанные с CSS-in-JS:
* При code review обращать внимание на наличие стабильных селекторов (`data-testid`) для ключевых интерактивных элементов.
* Настроить сериализатор для Jest-снапшотов, если используется компонентное тестирование.
* В e2e-сценариях использовать утверждения на CSS-свойства только там, где это критически важно для бизнеса (например, цветовая индикация статуса). Избегать хрупких тестов, проверяющих каждый пиксель.
Emotion — это не препятствие для тестирования, а повод перейти к более зрелым и устойчивым практикам. Отказ от хрупких селекторов по классу в пользу семантических и ролевых ведёт к созданию более доступных и надёжных пользовательских интерфейсов. Освоив инструменты браузера для инспекции и научившись писать правильные селекторы и утверждения, QA-инженер становится ключевым специалистом в обеспечении качества современных динамических фронтенд-приложений.
Комментарии (8)