Неожиданный токен Jest / Enzyme SVG Sprites <

У меня возникла проблема с созданием теста моментального снимка с Jest и Enzyme для компонента, использующего спрайты SVG.

Я использую пакет svg-sprite-loader: https://github.com/kisenka/svg-sprite-loader

Вот компонент, с которым у него проблемы:

import React from 'react';
import dieIcons from '../../public/images/dieIcons.svg';

const DieIcon = (props) => (
<svg className = {`die__icon icon-${props.name}`} onMouseDown = {props.onMouseDown} onMouseUp = {props.onMouseUp} onMouseOut = {props.onMouseOut}>
   <use xlinkHref = {`#dieIcons_${props.name}`} />
</svg>);

export default DieIcon;

Вот ошибка Jest:

Test suite failed to run

/home/ubuntu/workspace/tabletop-app/public/images/dieIcons.svg:2
<svg style = "display:none;">
^

SyntaxError: Unexpected token <

  at ScriptTransformer._transformAndBuildScript (node_modules/jest-runtime/build/ScriptTransformer.js:289:17)
  at Object.<anonymous> (src/components/DieIcon.js:2:17)
  at Object.<anonymous> (src/components/SingleRollDie.js:2:16)

Я пытался следовать руководству Jest о том, как обрабатывать статические активы следующим образом:

// in package.json
"jest": {
    "moduleNameMapper": {
      "modulePaths": ["/shared/vendor/modules"],
      "moduleFileExtensions": ["js", "jsx"],
      "moduleDirectories": ["node_modules", "bower_components", "shared"],
      "\\.(svg)$": "<rootDir>/src/tests/__mocks__/fileMock.js"
    }
}

Наконец, вот ссылка на мой проект GitHub: https://github.com/deannellis/tabletop

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
3
0
5 703
2

Ответы 2

Эта проблема возникает из-за того, что jest не может разрешить импорт SVG, который, как я думаю, в ваших проектах обрабатывается веб-пакетом.

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

Установите этот пакет:

npm install --save-dev identity-obj-proxy

Обновите свой moduleNameMapper в jest.config до следующего:

moduleNameMapper: {
  ".+\\.(svg|png|jpg)$": "identity-obj-proxy"
}

после установки identity-obj-proxy и обновления конфигурации jest, как вы предложили, теперь я получаю сообщение об ошибке: console.error node_modules / fbjs / lib / warning.js: 33 Предупреждение: React.createElement: тип недействителен - ожидался строка (для встроенных компонентов) или класс / функция (для составных компонентов), но получено: undefined. Скорее всего, вы забыли экспортировать свой компонент из файла, в котором он определен.

Dean N 24.09.2018 22:25

(svg | png | jpg |) измените на (svg | png | jpg) и проверьте один раз. Многие люди используют identify-obj-proxy для разрешения импорта svg, и все говорят, что он работает нормально.

Shubham Gupta 24.09.2018 22:39

К сожалению, после внесения этого изменения он по-прежнему дает указанную выше ошибку.

Dean N 24.09.2018 22:54

@DeanN ты догадалась?

OlehZiniak 14.03.2020 22:45

Я использую приложение Create React для приложения.

Наконец, этот вариант сработал для меня для импорта svgs, представленного ниже в package.json:

"jest": {
    "transform": {
      "^.+\\.[jt]sx?$": "babel-jest",
      "^.+\\.svg$": "jest-transform-stub"
    },
      "moduleNameMapper": {
          "^.+.(svg|png|jpg)$": "jest-transform-stub"
      }
  },

установить модуль jest-transform-stub.

Другие вопросы по теме