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', () => {})