Библиотека тестирования React не отображает Emotion CSS

Запуск библиотеки тестирования React для создания снимков на JSX, который использует опору Emotion css, приводит к тому, что CSS не отображается.

Я пробовал использовать @motion / jest / serializer, но все равно не повезло.

Компонент:

<button
      role="button"
      css={(theme)=> {
        backgroundColor: 'hotpink',
        '&:hover': {
          color: theme('lightgreen'),
        },
      }}
/>

Тест:

import React from 'react';
import { render } from '@testing-library/react';
import { createSerializer } from '@emotion/jest';

import { Component } from './component';

expect.addSnapshotSerializer(createSerializer());

describe('IconComponent', () => {
  it('should match the snapshot for the given props', () => {
    const { asFragment } = render(<Component icon="knownIcon" />);
    
    expect(asFragment()).toMatchSnapshot();
  });

Снимок: (отображается как анонимный объект, а не CSS)

exports[` 1`] = `
<DocumentFragment>
  <button
    css="[object Object]"
    role="button"
  />
</DocumentFragment>
`;

person Alex    schedule 18.05.2021    source источник


Ответы (1)


Я думаю, вам не хватает последнего шага.

https://emotion.sh/docs/css-prop

Установите прагму jsx в верхней части исходного файла, который использует опору css. Этот вариант лучше всего подходит для тестирования функции css prop ... например, Create React App 4, тогда / ** @jsx jsx / pragma может не работать, и вам следует использовать / * @jsxImportSource @ эмоция / реакция * / вместо этого.

Из документа по эмоциям добавление /* @jsxImportSource @emotion/react */ в начало файла компонента помогает css выполнить рендеринг, вероятно, в тесте.

CustomButton.js

/** @jsxImportSource @emotion/react */

export function CustomButton() {
  return (
    <button
      css={{
        "backgroundColor": "hotpink",
        "&:hover": {
          color: "lightgreen"
        }
      }}
    ></button>
  );
}

Результат

exports[`IconComponent should match the snapshot for the given props 1`] = `
<DocumentFragment>
  .emotion-0 {
  background-color: hotpink;
}

.emotion-0:hover {
  color: lightgreen;
}

<button
    class="emotion-0"
  />
</DocumentFragment>
`;

Если вы не используете приложение create-response-app, используйте вместо этого следующее:

/** @jsx jsx */
import { jsx } from '@emotion/react'

Вот репо, вы можете клонировать его, чтобы протестировать.


Старая версия

Для более старой версии response (‹16.4) вам нужно будет использовать back "@emotion/core" вместо "@emotion/react" для преобразования файла старым способом.

package.json

 "@emotion/core": "10.1.1",

Button.js

/** @jsx jsx */
import { jsx } from '@emotion/core' <--- use the @emotion/core to transpile the file in old way. 

import React from "react";

const Button = () => {
  return (
    <button
      css={{
        backgroundColor: "hotpink",
        "&:hover": {
          color: "lightgreen"
        }
      }}
    ></button>
  );
};

export default Button;

Вот репо для демонстрации.

person Mic Fung    schedule 24.05.2021
comment
Спасибо за ваше предложение, но это только для React 16.4.0 и более поздних версий. - person Alex; 25.05.2021
comment
Какую версию реакции вы используете? - person Mic Fung; 25.05.2021
comment
обновил ответ внизу. Я думаю, что лучше сказать нам, с какой версией реакции и эмоций вы столкнетесь в следующий раз. - person Mic Fung; 25.05.2021
comment
Конечно, трудно понять, какая информация требуется, сохраняя при этом как можно более краткую информацию. Я ценю приложенные усилия, опробую ваше обновленное предложение и поприветствую вас, спасибо - person Alex; 25.05.2021
comment
Я проверил, и, поскольку мы используем Emotion.sh/docs/@emotion/ babel-preset-css-prop эта строка автоматически добавляется в начало каждого файла - person Alex; 27.05.2021
comment
Похоже, плагин babel добавляет @emotion/react вместо @emotion/core - person Mic Fung; 27.05.2021
comment
проверьте, используете ли вы @ Emotion / babel-preset-css-prop v11 или v10. Если вы используете 11, импорт будет @emotion/react. Я читал исходный код. v10 will import @ эмоция / ядро` так попробуйте npm install @emotion/[email protected] - person Mic Fung; 27.05.2021
comment
просто попробуйте с чистой реакцией и babel с плагинами, которые вы упомянули. нет проблем с созданием класса css. слишком много неизвестного с вашей стороны, перепроверьте свои настройки с помощью репо github.com/michael-vascue/test-emotion-babel/blob/master/ - person Mic Fung; 27.05.2021
comment
Я согласен, что есть довольно много неизвестного, но также нет никакой онлайн-помощи для сериализации Emotion с использованием библиотеки тестирования React, поэтому я помог получить некоторую конкретную информацию. Я попробую выполнить обновление, как вы предлагаете сейчас, еще раз спасибо за вашу постоянную помощь - person Alex; 27.05.2021
comment
Мы на @ эмоции / babel-preset-css-prop: 11.2.0, - person Alex; 27.05.2021
comment
должно быть 10.2.1 - person Mic Fung; 27.05.2021
comment
Одно отличие здесь: вы используете объектную нотацию для параметра css, мы используем функцию, поскольку есть тема hoc. - person Alex; 27.05.2021
comment
Ok. не заметил, как вы изменили вопрос. попробую добавить тему - person Mic Fung; 27.05.2021
comment
вы используете emotion-theming? - person Mic Fung; 27.05.2021
comment
не знаю, какую библиотеку вы используете, синтаксис немного отличается от emotion-theming. отсутствует (), чтобы обернуть цвет, и объект &: hover для возврата, и theme('lightgreen') недействителен в тематике эмоций, где тема не является функцией - person Mic Fung; 27.05.2021
comment
протестировано с emotion-theming, никаких проблем. Но необходимо предоставить ThemeProvider в тесте, чтобы он мог передавать параметры темы детям. github.com/michael-vascue/ тест-эмоция-babel / blob / master / src / - person Mic Fung; 27.05.2021
comment
Я не против, смогу ли я заработать награду или нет. Для меня важнее умение решить проблему. Если вы не можете заставить его работать, можете ли вы сделать мне минимальный пример для работы? как файл js и package.json. - person Mic Fung; 27.05.2021
comment
Конечно попробую выложить завтра, сегодня все безумно занято. - person Alex; 27.05.2021