Невозможно использовать оператор импорта вне модуля @emotion

#javascript #reactjs #jestjs #create-react-app #emotion

#javascript #reactjs #jestjs #create-react-app #эмоция

Вопрос:

Я попытался протестировать компонент TextField с помощью Jest

text-field.test.js

 import React from "react";
import { render, screen } from "@testing-library/react";
import TextField from '../text-field'
import "@testing-library/jest-dom";

test('TextField', () => {
  render(<TextField name="Name" />)
  screen.debug()
})
  

text-field.js

 import React from "react";
import {
  FormControl,
  InputLabel,
  Input,
  FormHelperText,
} from "@material-ui/core";
import { css } from "@emotion/core";
import PropTypes from "prop-types";

const TextField = ({ name, helperText, error, value, onChange }) => {
  return (
    <FormControl error={error}>
      <InputLabel
        css={css`
          text-transform: capitalize;
        `}
        htmlFor={name}
      >
        {"Name"}
      </InputLabel>
      <Input id={name} value={value} onChange={onChange} />
      <FormHelperText id={`${name}-helper-text`}>{helperText}</FormHelperText>
    </FormControl>
  );
};

TextField.propTypes = {
  name: PropTypes.string.isRequired,
};

export default TextField;
  

Это моя конфигурация babel. Я включил @emotion/babel-preset-css-prop в babel перед запуском Jest.

babel.config.js

 // babel.config.js
module.exports = {
  presets: ["@emotion/babel-preset-css-prop", "@babel/preset-env"],
};
  

Я попытался запустить yarn test , но это завершается неудачей со следующей ошибкой.

     import { jsx as ___EmotionJSX } from "@emotion/core";
    ^^^^^^

    SyntaxError: Cannot use import statement outside a module

      at ScriptTransformer._transformAndBuildScript (node_modules/@jest/transform/build/ScriptTransformer.js:537:17)
      at ScriptTransformer.transform (node_modules/@jest/transform/build/ScriptTransformer.js:579:25)
  

Есть идеи?

Ответ №1:

Я думаю, что проблема в create-react-app скрипте, который каким-то образом помещает ваш @emotion/babel-preset-css-prop в начало presets списка, в который я не заглядывал глубоко.

Я бы посоветовал вам полностью контролировать свой тест, просто создав свой собственный скрипт для запуска вашего теста, который довольно прост, например: npx jest которым вы можете полностью контролировать свой тест.

Вот несколько шагов для этого:

Добавьте свой тест скрипта package.json

 scripts: {
  test: "jest"
}
  

Настройте свой тест на node babel.config.js :

 module.exports = {
  presets: [
    ["@babel/preset-env", {
      targets: {
        node: 'current',
      },
    }],
    "@emotion/babel-preset-css-prop",
  ]
};
  

Добавьте свои пользовательские сопоставления, которые предлагает create-react-app скрипт, предлагаемый в ваших файловых тестах import "@testing-library/jest-dom/extend-expect" :

 import React from "react";
import { render, screen } from "@testing-library/react";
import "@testing-library/jest-dom";
import "@testing-library/jest-dom/extend-expect" // Add custom matcher
import Layout from "../layout";

test("Check if layout display title according to prop", async () => {
  const { getByText } = render(<Layout title={"Abc"} />);
  expect(getByText("Abc")).toBeInTheDocument(); // To have kind of matcher
});

// ...
  

Вот и все! Надеюсь, вы бы лучше контролировали свои тесты, вместо того чтобы не иметь идей о том, как настраивать jest параметры с помощью другого скрипта.

Комментарии:

1. Хммм. Можете ли вы тогда предоставить воспроизводимый репозиторий?

2. Кстати, вы также можете поделиться своей конфигурацией jest?

3. У меня нет конфигурации jest.

4. Вот репозиторий github.com/Techberg/pluto/tree/dev-content-model

5. Хорошо, я посмотрю