TS-JEST не признает импорт ES6
Я добавляю поддержку машинописи в реагирующую кодовую базу, и пока приложение работает нормально, шутливые тесты не проходят повсеместно, очевидно, что-то не распознавая синтаксис es6.
Мы используем ts-jest для этого. Ниже я получаю сообщение об ошибке, сразу же при попытке обработать установочный файл тестов Jest.
FAIL src/data/reducers/reducers.test.js
● Test suite failed to run
/Users/ernesto/code/app/react/setupTests.js:1
({"Object.<anonymous>":function(module,exports,require,__dirname,__filename,global,jest){import './polyfills';
^^^^^^^^^^^^^
SyntaxError: Unexpected string
at ScriptTransformer._transformAndBuildScript (node_modules/jest-runtime/build/script_transformer.js:403:17)
Он не может распознать простой import './polyfills'
, сказав, что указанная строка является неожиданной.
Это мои настройки:
jest config в package.json
"jest": {
"setupTestFrameworkScriptFile": "<rootDir>/app/react/setupTests.js",
"transform": {
"^.+\\.tsx?$": "ts-jest"
},
"testRegex": "(/__tests__/.*|(\\.|/)(test|spec))\\.(jsx?|tsx?)$",
"moduleFileExtensions": [
"ts",
"tsx",
"js",
"jsx",
"json",
"node"
]
},
tsconfig.json
{
"compilerOptions": {
"declaration": false,
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"lib": ["es6", "dom"],
"module": "es6",
"moduleResolution": "node",
"allowJs": true,
"allowSyntheticDefaultImports": true,
"sourceMap": true,
"target": "es5",
"jsx": "react",
"forceConsistentCasingInFileNames": true,
"noImplicitReturns": true,
"noImplicitThis": true,
"noImplicitAny": true,
"skipDefaultLibCheck": true,
"strictPropertyInitialization": true,
"strictNullChecks": true,
"suppressImplicitAnyIndexErrors": true,
"noUnusedLocals": true,
"noErrorTruncation": true
},
"exclude": ["app/assets","node_modules", "vendor", "public"],
"compileOnSave": false
}
.babelrc
{
"presets": [
[
"env",
{
"modules": false,
"targets": {
"browsers": "> 1%",
"uglify": true
},
"useBuiltIns": true
}
],
"react",
"es2015"
],
"plugins": [
"syntax-dynamic-import",
"transform-object-rest-spread",
[
"transform-class-properties",
{
"spec": true
}
]
]
}
Если это уместно, это кодовая база React, используемая в приложении rails, и мы используем rails / webpacker для этого. Мы следовали их инструкциям, чтобы добавить поддержку TypeScript, и это работало как шарм, за исключением этой забавной части, которую они не охватывают.
4 ответа
В конце концов я выяснил, в чем проблема. Оказывается, это было в README ts-jest все время.
В README есть раздел " Использование функций ES2015+" в файлах Javascript. В этих случаях вам нужно указать шутку, чтобы использовать babel-jest
в качестве преобразования для файлов.js.
"jest": {
"transform": {
"^.+\\.jsx?$": "babel-jest", // Adding this line solved the issue
"^.+\\.tsx?$": "ts-jest"
},
// ...
},
Ключом для меня было осознание того, что тесты также должны быть преобразованы в машинописный текст!!!
Мне не удалось найти конфигурацию, которая работала бы с сохранением тестов js, но преобразование тестов в ts исправляет эту ошибку, например
mv tests/stuff.test.js tests/stuff.test.ts
Преимущество ts-jest в целом заключается в возможности проводить тесты ts, так что в любом случае это хорошо.
Как видно из документации, для ts-jest требуются модули CommonJS, так как ваш основной tsconfig.json
наборы "module": "es6"
вам нужно будет создать отдельный tsconfig.json
файл для ts-jest, расширяющий ваш основной tsconfig.json
и устанавливает "module": "commonjs"
,
Если вы используете create-Reaction-app, попробуйте это:
Несмотря на то, что create-реакции-приложение поставляется с предварительно настроенными настройками, нам все равно пришлось добавить пользовательскую конфигурацию, поскольку наше приложение изначально не создавалось с помощью cra. Я установил некоторые новые зависимости dev:
"babel-cli": "^6.26.0",
"babel-jest": "^22.4.1",
"babel-preset-react-app": "^3.1.1",
А также обновил .babelrc
(создайте этот файл, если он не существует):
{
"presets": [
"@babel/preset-env",
"@babel/preset-react"
]
}
А теперь и jest, и npm test работают как надо.