CSS-модули не работают должным образом в тестах с Jest и Enzyme, используя create-react-app

#reactjs #jestjs #enzyme #react-css-modules

#reactjs #jestjs #enzyme #react-css-modules

Вопрос:

Я использую CSS-модули в приложении CRA. Мой компонент выглядит так:

 import HeaderStyles from './Header.module.scss';

const Header: FunctionComponent<HeaderProps> = ({
// Props
}) => (
  <div className={HeaderStyles['header-container']}>
  // Some other stuff
)
  

Мой тест выглядит так:

     const component = shallow(
      <Header />
    );

    expect(component.find('.header-container')).toBeTruthy();
  

Я бы ожидал, что это завершится неудачей, поскольку имя класса должно быть чем-то другим, поскольку я использую модули CSS. Я что-то здесь упускаю?

Ответ №1:

Я исследовал и обнаружил, что либо jest, либо react-scripts загружают просто пустой объект вместо этого модуля стиля. Я предполагаю, что они используют другой загрузчик или что-то в этом роде, но это круто, так как в модульном тестировании вам нужно протестировать только свою часть пакетов или загрузчиков, а не то, как работают другие пакеты, так что все в порядке.

Странно то, что любой стажер начнет с запроса HeaderStyles['header-container'] , что приведет к недопустимому тестированию и займет гораздо больше времени.

Поэтому я предлагаю переключиться на использование стилей исправлений, что является гораздо более декларативным и устраняет странности в тестах. С помощью PatchStyles вам необходимо изменить свой код на

 <PatchStyles classNames={HeaderStyles}>
  <div className="header-container">...</div>
</PatchStyles>
  

и он автоматически применит стили заголовков вместо вас. Для получения дополнительной информации взгляните на пример StackBlitz .