В тесте Jest не переносит модули ES6 (SyntaxError: неожиданный экспорт токена) - PullRequest
0 голосов
/ 03 октября 2018

Я нахожусь в точке кипения, когда Jest разбирается в синтаксисе импорта / экспорта модулей ES6, и это мешает моему развитию проекта.Моя структура проекта следующая:

root module
  org-domain (ES6)
  org-services (ES6)
  react-ui-module (React via CRA2)

org-services имеет локальную зависимость пути от org-domain в своем пакете json:

// in org-services package.json

"dependencies": {
   "@org/domain": "file:../org-domain",
},

My .babelrc in org-servicesвыглядит следующим образом:

{
  "env": {
    "test": {
      "presets": ["@babel/preset-flow", "@babel/preset-env"]
      "plugins": ["@babel/plugin-transform-modules-commonjs"]
    }
  },
  "presets": [
    "@babel/preset-flow",
    ["@babel/preset-env", {
      "targets": {
        "esmodules": true
      }
    }]
  ],
  "plugins": [
    ["module-resolver", {
      "root": ["./node_modules/@org/domain"],
      "alias": {
        "@org/constants": "./node_modules/@org/domain/src/constants",
        "@org/contracts": "./node_modules/@org/domain/src/request-contracts"
      }
    }]
  ]
}

Я не знаю, связана ли проблема с тем, как я включаю мои зависимости, поэтому я собираюсь добавить более подробную информацию обо всем, что связано с моим импортом / экспортом этих модулейдля ясности.

В файлах реализации org-services я импортирую org-domain, используя синтаксис npm, например: import ... from '@org/domain

Вот некоторые наблюдения, которые у меня есть:

В локальной разработке, когда я пытаюсь сослаться на ссылку, нажмите @org/domain, вместо того, чтобы быть направленным на org-services/node_modules/@org/domain, я перенаправлен на фактическое относительное местоположение каталога, которое составляет root/org-services.Я считаю, что Джест игнорирует node_modules (поправьте меня, если я ошибаюсь), но в моем jest.config.js для org-services у меня есть:

collectCoverage: true,
coverageDirectory: 'coverage',
coveragePathIgnorePatterns: [
  '/node_modules/'
],
moduleDirectories: [
  'src',
  'node_modules'
],
moduleFileExtensions: [
  'js'
],
transform: {
  '^.+\\.js$': 'babel-jest'
},
transformIgnorePatterns: [
  'node_modules/(?!@org/domain)$'
]

Насколько я понимаю, все должно работать прямо сейчас со всемиУ меня есть конфигурация, касающаяся установки плагина @babel/plugin-transform-modules-commonjs в тесте (в пределах .babelrc) и включения инструкции '^.+\\.js$': 'babel-jest' под клавишей transform в jest.config.js, расположенной в org-services - но это не так.

Я попробовал все, что смог найти в Интернете по этому вопросу, но безуспешно.С тех пор я никуда не попал, и мое терпение теряется из-за этой инфраструктуры тестирования и отсутствия поддержки ES6.Это не должно быть так сложно, так ясно, что я здесь что-то не так делаю.Пожалуйста, сообщите.

Обновление 1

Найден еще один пост SO, который отражает ситуацию, в которой я нахожусь. Jest не удается перенести импорт из связанного модуля npm

К сожалению, предоставленное решение не работает для моего случая.

1 Ответ

0 голосов
/ 07 октября 2018

После обновления с @ babel / xyz: 7.0.0 до 7.1.2 я начал получать сообщение об ошибке «import»

Jest encountered an unexpected token

<snip>

Details:

C:\....\SstcStrategy.test.js:2
import sequelizeFixtures from 'sequelize-fixtures';
^^^^^^

SyntaxError: Unexpected token import

  at ScriptTransformer._transformAndBuildScript (node_modules/jest-runtime/build/script_transformer.js:403:17)

Чтобы исправить это, мне пришлось добавить @babel/plugin-transform-modules-commonjs, как вы упомянули вВаш вопрос.

Мой babel.config.js теперь выглядит следующим образом:

module.exports = {
  presets: [
    [
      '@babel/preset-env',
      {
        targets: {
          node: '8.10',
        },
        debug: false,
      },
    ],
  ],
  ignore: ['node_modules'],
  plugins: [
    '@babel/plugin-transform-runtime',
    '@babel/plugin-transform-modules-commonjs',

    // Stage 2
    ['@babel/plugin-proposal-decorators', { legacy: true }],
    '@babel/plugin-proposal-function-sent',
    '@babel/plugin-proposal-export-namespace-from',
    '@babel/plugin-proposal-numeric-separator',
    '@babel/plugin-proposal-throw-expressions',

    // Stage 3
    '@babel/plugin-syntax-dynamic-import',
    '@babel/plugin-syntax-import-meta',
    ['@babel/plugin-proposal-class-properties', { loose: false }],
    '@babel/plugin-proposal-json-strings',
  ],
};

Кроме того, кстати, вам не нужно определять babel-jest преобразование в jest.config.js, так как это настройка по умолчанию.

Надеюсь, это поможет

...