2017-02-14 9 views
10

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

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

Здесь ошибка:

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

Вот соответствующие биты конфигурации:

jest.conf.json

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

.babelrc

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

Test сценарий

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 необходим для того, чтобы Шутки, чтобы найти мои тесты, я пытался двигаться тесты, тестовый каталог по умолчанию, и они все еще не работают.

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

Update # 2

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

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

Решение

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

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

Что происходит, когда вы удаляете часть 'transform', формируете настройку шутки. Это не нужно в простых случаях. –

+0

@ AndreasKöberle Я получаю ту же ошибку, да, ваше право Мне она, похоже, не нужна – jamiedust

+0

Вы пробовали работать без 'jest.conf.js'? Он должен работать без дополнительной конфигурации. – Mayas

ответ

3

По умолчанию любой код в node_modules игнорируется babel-jest см шутя вариант конфигурации transformIgnorePatterns. Я также создал PR on your example repo, так что вы можете видеть, как он работает.

Хотя это работает, я обнаружил, что он очень медленный в реальных приложениях, которые содержат множество зависимостей, содержащих модули ES. Jest codebase имеет несколько иной подход к этому, как вы можете найти в «зависимые преобразования babel-jest»(извините, не разрешаю отправлять более 2 URL-адресов). Это также может занять намного больше времени в Windows, см. «Взятие 10 секунд при пустом репо».

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

+0

Спасибо, я не успел проверить PR, но я это сделаю. Я пробовал использовать несколько параметров Jest, в том числе, я считаю, transformIgnorePatterns, однако, возможно, я сделал что-то не так, поэтому проверю его. – jamiedust

+1

Наконец-то был момент, чтобы проверить PR и приняли, теперь я могу отлично провести тесты. Как бы то ни было, мы застряли с нашей сумкой Karma/Jasmine. В пользу других, следующие конфигурации работали в решении этого: ' "шутка": { " transformIgnorePatterns": [ "/node_modules/(?!test-component).+\\.js$" ] }, – jamiedust

2

Вы можете попробовать добавить Трансформирование-es2015-модули-CommonJS плагин в файл конфигурации Бабель только для тестирования. Вот пример конфигурационного файла, который сообщает 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

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

NODE_ENV=test jest --no-cache 

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

+0

Спасибо @A. Cookro, которого я раньше пробовал, просто попробовал снова и не повезло, babel, похоже, все еще игнорирует файлы в node_modules. – jamiedust

+0

Не знаю, почему, но это сработало для меня. – Naz

+0

После того, как вы попробовали 10 других вещей, это решение было единственным, кто вел себя правильно с помощью импорта ES6. – Eek

0

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

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

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

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

Спасибо, я попробую это решение и позволю вы знаете, как это работает. – jamiedust