Babel-jest не обрабатывает ES6 в модулях

Я пытаюсь настроить Jest на проект, основанный на React, который использует модули ES6. Однако у меня, похоже, проблемы с модулями ES6, я использую babel-jest и считаю, что у меня это настроено правильно (Jest обнаруживает его автоматически).

Jest, похоже, не имеет проблемы с импортом ES6, но как только он попадает в оператор импорта в одном из импортированных модулей, он задыхается. Это, как если бы он только перескакивал начальный тест script, а не какой-либо из импортированных модулей. Я пробовал различные конфигурации и искал Google без везения. Запуск тестов без импортных работ прекрасен.

Вот ошибка:

({"Object.<anonymous>":function(module,exports,require,__dirname,__filename,global,jest){import Predications from './predications';
                                                                                         ^^^^^^
SyntaxError: Unexpected token import

Вот соответствующие биты config:

jest.conf.json

{
  "testRegex": "\/test\/spec\/.*\\.js$",
}

.babelrc

{
  "presets": ["es2015", "stage-0", "react"]
}

Тест script

import React from 'react';
import { mount, shallow } from 'enzyme';
import Slider from 'react-slick';
import Carousel from '../../client/components/carousel/carousel.js'; // test chokes on when I include this module

describe('carousel component', () => {
  it('is a test test case', () => {
    expect(1 + 2).toEqual(3);
  });
});

Update:

Как и было предложено, я попытался запустить тест без jest.conf.js, однако testRegex необходим для того, чтобы Jest мог найти мои тесты, я попробовал переместить тесты в тестовый каталог по умолчанию, и они все еще терпят неудачу.

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

Обновление # 2

После некоторого расследования выясняется, что проблема не в том, что Babel не транслирует ES6 внутри node_modules. Я создал пример repo, чтобы продемонстрировать это здесь: https://github.com/jamiedust/babel-jest-example

Я понимаю, что сторонние модули должны обрабатывать свои собственные транспиляции, однако у нас есть ряд модулей, которые размещаются на нашем собственном реестре npm и повторно используются между проектами, в этом случае Webpack обрабатывает трансляцию, для тестов Jest нам нужно, чтобы эти node_modules были переделаны Вавилоном или способом использования нашего веб-пакета, настроенного для этого для нас.

Решение

Добавьте следующий конфигурационный файл в файл package.json(или Jest).

"jest": {
  "transformIgnorePatterns": [
    "/node_modules/(?!test-component).+\\.js$"
  ]
}

Ответ 1

По умолчанию любой код в node_modules игнорируется babel-jest, см. параметр конфигурации Jest transformIgnorePatterns. Я также создал (извините, не разрешите отправлять более двух URL-адресов). Это также может занять намного больше времени в Windows, см. "Взятие 10 секунд при пустом репо" .

Если вы выполняете "единичное" тестирование, насмехается, вероятно, лучший способ пойти.

Ответ 2

Вы можете попробовать добавить плагин transform-es2015-modules-commonjs в свой конфигурационный файл babel только для тестирования. Вот пример конфигурационного файла, который сообщает babel о пересылке модулей только в тестовой среде. Вы можете установить его под ваши пресеты:

{
  "presets": [
    "react",
    ["es2015", {"modules": false, "loose": true}]
  ],
  "env": {
    "test": {
      "plugins": ["transform-es2015-modules-commonjs"]
    }
  }
}

Здесь вы можете прочитать о плагине:

https://www.npmjs.com/package/babel-plugin-transform-es2015-modules-commonjs

Затем при запуске тестов Jest в командной строке укажите NODE_ENV = test (вам может потребоваться добавить флаг -no-cache в команду в первый раз после внесения изменений в конфигурацию babel, поскольку Jest кэширует вывод бабуля, но после этого вы можете оставить его:

NODE_ENV=test jest --no-cache

Я узнал об этой проблеме на семинаре React Брайана Холта в Frontend Masters. https://frontendmasters.com/courses/

Ответ 3

Я столкнулся с той же проблемой (node_module, не переданный babel-jest), не имея возможности ее решить.

Вместо этого я, наконец, добился успеха, издеваясь над узлом_модулем, как описано здесь https://facebook.github.io/jest/docs/manual-mocks.html

NB: установка mocks в __mocks__ вложенных папок не сработала для меня. Поэтому я передал макет как второй параметр функции jest.mock(). Что-то вроде:

    jest.mock('your_node_module', () => {})