рдкреНрдпрд╛рд░ рдЬреЗрд╕реНрдЯ? рдХреГрдкрдпрд╛ рд╣рдорд╛рд░реЗ рд╕рдореВрд╣ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ: ЁЯСЙ https://opencollective.com/jest/donate
рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдРрдк рдореЗрдВ рдЬреЗрд╕реНрдЯ рдХреЗ рд╕рд╛рде рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╕рдордп, рдореБрдЭреЗ рдПрдХ Jest encountered an unexpected token
рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИред рдореИрдВрдиреЗ Link
рдШрдЯрдХ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдИ рдФрд░ рд╕реАрдзреЗ рдпрд╣рд╛рдВ рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ред рдпрд╣ рддреНрд░реБрдЯрд┐ рд╣реИ:
FAIL src/components/Link.test.js
тЧП Test suite failed to run
Jest encountered an unexpected token
This usually means that you are trying to import a file which Jest cannot parse, e.g. it's not plain JavaScript.
By default, if Jest sees a Babel config, it will use that to transform your files, ignoring "node_modules".
Here's what you can do:
тАв To have some of your "node_modules" files transformed, you can specify a custom "transformIgnorePatterns" in your config.
тАв If you need a custom transformation specify a "transform" option in your config.
тАв If you simply want to mock your non-JS modules (e.g. binary assets) you can stub them out with the "moduleNameMapper" config option.
You'll find more details and examples of these config options in the docs:
https://jestjs.io/docs/en/configuration.html
Details:
SyntaxError: C:\workspace\react\testapp\src\components\Link.test.js: Unexpected token (8:4)
6 | test('Link changes the class when hovered', () => {
7 | const component = renderer.create(
> 8 | <Link page="http://www.facebook.com">Facebook</Link>,
| ^
9 | );
10 | let tree = component.toJSON();
11 | expect(tree).toMatchSnapshot();
at Parser.raise (node_modules/@babel/parser/lib/index.js:3938:15)
at Parser.unexpected (node_modules/@babel/parser/lib/index.js:5247:16)
at Parser.parseExprAtom (node_modules/@babel/parser/lib/index.js:6327:20)
at Parser.parseExprSubscripts (node_modules/@babel/parser/lib/index.js:5923:21)
at Parser.parseMaybeUnary (node_modules/@babel/parser/lib/index.js:5902:21)
at Parser.parseExprOps (node_modules/@babel/parser/lib/index.js:5811:21)
at Parser.parseMaybeConditional (node_modules/@babel/parser/lib/index.js:5783:21)
at Parser.parseMaybeAssign (node_modules/@babel/parser/lib/index.js:5730:21)
at Parser.parseExprListItem (node_modules/@babel/parser/lib/index.js:6994:18)
at Parser.parseCallExpressionArguments (node_modules/@babel/parser/lib/index.js:6123:22)
рдпрд╣ рд░рд╣рд╛ рдореЗрд░рд╛ package.json
{
"name": "testapp",
"version": "1.0.0",
"main": "index.js",
"license": "MIT",
"scripts": {
"start": "webpack-dev-server --config ./config/webpack.config.development.js",
"build": "webpack -p --config ./config/webpack.config.production.js",
"test": "jest"
},
"dependencies": {
"axios": "^0.18.0",
"moment": "^2.22.2",
"polished": "^2.0.3",
"prop-types": "^15.6.2",
"react": "^16.4.2",
"react-delay-render": "^0.1.2",
"react-dom": "^16.4.2",
"react-imported-component": "^4.6.2",
"react-router-dom": "^4.3.1",
"simple-grid": "^1.0.1",
"styled-components": "^3.4.5",
"uuid": "^3.3.2",
"validator": "^10.7.0"
},
"devDependencies": {
"@babel/core": "^7.0.0",
"@babel/plugin-proposal-class-properties": "^7.0.0",
"@babel/plugin-syntax-dynamic-import": "^7.0.0",
"@babel/preset-env": "^7.0.0",
"@babel/preset-react": "^7.0.0",
"babel-core": "7.0.0-bridge.0",
"babel-jest": "^23.4.2",
"babel-loader": "^8.0.0",
"babel-plugin-styled-components": "^1.6.0",
"css-loader": "^1.0.0",
"html-webpack-plugin": "^3.2.0",
"jest": "^23.5.0",
"mini-css-extract-plugin": "^0.4.2",
"react-test-renderer": "^16.4.2",
"regenerator-runtime": "^0.12.1",
"style-loader": "^0.23.0",
"webpack": "^4.17.1",
"webpack-cli": "^3.1.0",
"webpack-dev-server": "^3.1.7"
}
}
рдпрд╣рд╛рдБ рдореЗрд░реА .babelrc
рдлрд╝рд╛рдЗрд▓ (рд░реВрдЯ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд╕реНрдерд┐рдд) рд╣реИ:
{
"plugins": [
"@babel/plugin-proposal-class-properties",
"babel-plugin-styled-components",
"@babel/plugin-syntax-dynamic-import"
],
"presets": ["@babel/preset-env", "@babel/preset-react"],
"env": {
"development": {
"plugins": [
"@babel/plugin-proposal-class-properties",
["babel-plugin-styled-components", { "displayName": true }],
"@babel/plugin-syntax-dynamic-import"
],
"presets": ["@babel/preset-env", "@babel/preset-react"]
},
"test": {
"plugins": [
"@babel/plugin-proposal-class-properties",
["babel-plugin-styled-components", { "displayName": true }],
"@babel/plugin-syntax-dynamic-import"
],
"presets": ["@babel/preset-env", "@babel/preset-react"]
},
"production": {
"plugins": [
"@babel/plugin-proposal-class-properties",
"babel-plugin-styled-components",
"@babel/plugin-syntax-dynamic-import"
],
"presets": ["@babel/preset-env", "@babel/preset-react"]
}
}
}
рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдкреБрди: рдкреЗрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрджрдо:
yarn add --dev babel-jest babel-core@^7.0.0-0 @babel/core
рд╕рд╛рде рдЬреЗрд╕реНрдЯ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдВyarn test
рдЪрд▓рд╛рдПрдБnpx envinfo --preset jest
рдкрд░рд┐рдгрд╛рдо рдпрд╣рд╛рдВ рдкреЗрд╕реНрдЯ рдХрд░реЗрдВ:
OS: Windows 10
CPU: x64 Intel(R) Xeon(R) CPU E3-1505M v6 @ 3.00GHz
Binaries:
Yarn: 1.5.1 - C:\Program Files (x86)\Yarn\bin\yarn.CMD
npm: 5.6.0 - C:\Program Files\nodejs\npm.CMD
рдореБрдЭреЗ рднреА рдпрд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИред
рд╡рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИред
рдпрд╣рд╛рдБ рд╡рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИ .. рдереЛрдбрд╝рд╛ рдФрд░ рдЬрдЯрд┐рд▓ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдПрдХ рдореЛрдиреЛрд░реЗрдкреЛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдБред
@fabioSalimbeni @hoaiduyit @mikedloss рдореИрдВрдиреЗ рдЕрдкрдирд╛ рд░рд┐рдПрдХреНрдЯ рдФрд░ рд░рд┐рдПрдХреНрдЯ рдиреЗрдЯрд┐рд╡ рдЯреЗрд╕реНрдЯ ( Jest
рдФрд░ enzyme
) рдХрд░ рд▓рд┐рдпрд╛ рд╣реИ, рдЬреЛ рд▓рд░реНрдирд╛ рдореЛрдиреЛрд░реЗрдкреЛ рдореЗрдВ рдмреИрдмреЗрд▓ 7 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд╛рд╕ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
рдпрджрд┐ рдЖрдк рдПрдХ рдореЛрдиреЛрд░реЗрдкреЛ рдореЗрдВ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ рддреЛ рдЖрдкрдХреЛ babel.config.js
рд╕рд╛рде рдирдП рдмреИрдмреЗрд▓ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: https://babeljs.io/docs/en/v7-migrationред
рдореЛрдиреЛрд░реЗрдкреЛ рдХреА рдЬрдбрд╝ рдХреЗ рд▓рд┐рдП рдпрд╣ рдореЗрд░рд╛ babel.config.js
:
module.exports = {
overrides: [
{
test: 'platforms/webApp1',
extends: 'platforms/webApp1/babel.config.js'
},
{
test: 'platforms/webApp2',
extends: 'platforms/webApp2/babel.config.js'
}
]
};
рдореЛрдиреЛрд░реЗрдкреЛ рдРрдкреНрд╕ рдореЗрдВ рд╕реЗ рдПрдХ webApp1
рд▓рд┐рдП рдореЗрд░рд╛ babel.config.js
рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
module.exports = {
env: {
test: {
presets: [
[
'@babel/preset-env',
{
modules: 'commonjs',
debug: false
}
],
'@babel/preset-flow',
'@babel/preset-react'
],
plugins: [
'@babel/plugin-syntax-dynamic-import',
'@babel/plugin-proposal-class-properties'
]
},
production: {
presets: [
['@babel/preset-env', { modules: false }],
'@babel/preset-flow',
'@babel/preset-react'
],
plugins: [
'@babel/plugin-syntax-dynamic-import',
'@babel/plugin-proposal-class-properties'
]
},
development: {
presets: [
['@babel/preset-env', { modules: false }],
'@babel/preset-flow',
'@babel/preset-react'
],
plugins: [
'@babel/plugin-syntax-dynamic-import',
'@babel/plugin-proposal-class-properties'
]
}
}
};
рдФрд░ рдпрд╣ рдЬреЗрд╕реНрдЯ рд╡рд┐рдиреНрдпрд╛рд╕ рд╣реИ:
"jest": {
"verbose": true,
"clearMocks": true,
"collectCoverage": true,
"setupTestFrameworkScriptFile": "<rootDir>/config/setupTest.js",
"transform": {
"^.+\\.js$": "babel-jest"
},
"moduleNameMapper": {
"\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$": "<rootDir>/__mocks__/fileMock.js",
"\\.(css|scss)$": "<rootDir>/__mocks__/styleMock.js"
}
}
setupTest.js
рдРрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:
const Enzyme = require('enzyme');
const Adapter = require('enzyme-adapter-react-16');
Enzyme.configure({ adapter: new Adapter() });
fileMocks.js
рдРрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:
module.exports = 'i-am-a-stubbed-file';
styleMocks.js
рдРрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:
module.exports = {};
рдЖрдкрдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдРрдк рдХреЗ package.json
рдореЗрдВ рдХреБрдЫ рдмреИрдмреЗрд▓ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдФрд░ babel-core
рд╕рдВрд╕реНрдХрд░рдг рдХреЛ devDependencies
рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛:
...
"@babel/cli": "^7.0.0",
"@babel/core": "^7.0.0",
"@babel/plugin-proposal-class-properties": "^7.0.0",
"@babel/plugin-syntax-dynamic-import": "^7.0.0",
"@babel/preset-env": "^7.0.0",
"@babel/preset-flow": "^7.0.0",
"@babel/preset-react": "^7.0.0",
"babel-core": "7.0.0-bridge.0",
"babel-eslint": "^9.0.0",
"babel-jest": "^23.4.2",
"babel-loader": "^8.0.2",
...
"jest": "^23.5.0",
"jest-cli": "^23.5.0",
...
3 рджрд┐рдиреЛрдВ рдХреЗ рдмрд╛рдж, рдореИрдВ рдмрд╕ рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рд╕рдорд╛рдзрд╛рди рдвреВрдВрдврддрд╛ рд╣реВрдВред
рдЗрд╕рдХреЗ рд▓рд┐рдП 2 рд╕рдорд╛рдзрд╛рди рд╣реИрдВ:
рдЖрдк рдЕрдкрдиреА рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдирд╛рдо .babelrc
рд╕реЗ babel.config.js
, рдФрд░ рдпрд╣ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред
## рд╕рдорд╛рдзрд╛рди 2:
рдореИрдВ рдЗрд╕ рддрд░рд╣ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдБред
рдЗрд╕ рддрд░рд╣ рдПрдХ рдЯреНрд░рд╛рдВрд╕рдлрд╝реЙрд░реНрдо рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБ (рдореЗрд░рд╛ рд╣реИ jest-transforme.js
):
const config = {
babelrc: false,
presets: [
[
"@babel/env",
{
modules: false
}
],
"@babel/react"
],
plugins: [
["@babel/plugin-proposal-decorators", { legacy: true }],
["@babel/plugin-proposal-class-properties", { loose: true }],
"transform-es2015-modules-commonjs"
]
};
module.exports = require("babel-jest").createTransformer(config);
рдпрд╣рд╛рдБ рдореЗрд░рд╛ jest.config.js
:
module.exports = {
collectCoverageFrom: ["src/**/*.{js,jsx,mjs}"],
testMatch: ["<rootDir>/src/**/__tests__/**/*.{js,jsx,mjs}", "<rootDir>/src/**/?(*.)(spec|test).{js,jsx,mjs}"],
transform: {
"^.+\\.(js|jsx|mjs)$": "<rootDir>/config/jest/jest-transformer.js"
},
transformIgnorePatterns: ["[/\\\\]node_modules[/\\\\].+\\.(js|jsx|mjs)$"]
};
рдФрд░ рдореЗрд░реЗ рдкрд╛рд╕ рдЕрднреА рднреА рдореЗрд░рд╛ .babelrc
```
рдХреЙрдиреНрд╕реНрдЯ рдПрдирд╡рд╛рдпрд░рдореЗрдВрдЯ = рдЖрд╡рд╢реНрдпрдХрддрд╛ ("./env-config.js");
рдореЙрдбреНрдпреВрд▓.рдПрдХреНрд╕рдкреЛрд░реНрдЯ = {
рдкреНрд░реАрд╕реЗрдЯ: [
[
"рдЕрдЧрд▓рд╛/рдмреЗрдмреЗрд▓",
{
"рдкреНрд░реАрд╕реЗрдЯ-рдПрдирд╡реА": {
рдмрд┐рд▓реНрдЯрдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ: "рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐"
}
}
]
],
рдкреНрд▓рдЧрдЗрдиреНрд╕: [
["рд╕реНрдЯрд╛рдЗрд▓-рдШрдЯрдХ", {рдПрд╕рдПрд╕рдЖрд░: рд╕рдЪ, рдкреНрд░рджрд░реНрд╢рди рдирд╛рдо: рд╕рдЪ, рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕: рдЭреВрдард╛}],
[
"рдореЙрдбреНрдпреВрд▓-рд░рд┐рдЬрд╝реЙрд▓реНрд╡рд░",
{
рдЬрдбрд╝: ["ред/"]
}
]
],
рдкрд░реНрдпрд╛рд╡рд░рдг: {
рджреЗрд╡: {
рдкреНрд▓рдЧрдЗрдиреНрд╕: [
["рд░реВрдкрд╛рдВрддрд░рдг-рдкрд░рд┐рднрд╛рд╖рд┐рдд", рд╡рд╛рддрд╛рд╡рд░рдг],
["рдореЙрдбреНрдпреВрд▓-рд░рд┐рдЬрд╝реЙрд▓реНрд╡рд░", {рд░реВрдЯ: [./"] }],
"рд░реВрдкрд╛рдВрддрд░рдг-рд╕рдЬреНрдЬрд╛рдХрд╛рд░-рд╡рд┐рд░рд╛рд╕рдд",
"рд░реВрдкрд╛рдВрддрд░рдг-рд╡рд░реНрдЧ-рдЧреБрдг"
]
},
рдирд┐рд░реНрдорд╛рдг: {
рдкреНрд▓рдЧрдЗрдиреНрд╕: [
["рд░реВрдкрд╛рдВрддрд░рдг-рдкрд░рд┐рднрд╛рд╖рд┐рдд", рд╡рд╛рддрд╛рд╡рд░рдг],
["рдореЙрдбреНрдпреВрд▓-рд░рд┐рдЬрд╝реЙрд▓реНрд╡рд░", {рд░реВрдЯ: [./"] }],
"рд░реВрдкрд╛рдВрддрд░рдг-рд╕рдЬреНрдЬрд╛рдХрд╛рд░-рд╡рд┐рд░рд╛рд╕рдд",
"рд░реВрдкрд╛рдВрддрд░рдг-рд╡рд░реНрдЧ-рдЧреБрдг"
]
},
рдЙрддреНрдкрд╛рджрди: {
рдкреНрд░реАрд╕реЗрдЯ: [
[
"рдЫреЛрдЯрд╛ рдХрд░реЗрдВ", // рдпрд╣рд╛рдВ рдЫреЛрдЯрд╛ рдХреНрдпреЛрдВ рдЬреЛрдбрд╝реЗрдВ, рд╣рдо рдкреВрд░реЗ рдХреЛрдб рдмрдВрдбрд▓реЛрдВ рдкрд░ uglify рдЪрд▓рд╛рддреЗ рд╣реИрдВ
{
рдордВрдЧрд▓рд╛: рдЭреВрдард╛,
рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░реЗрдВ: рдЭреВрдард╛
}
]
],
рдкреНрд▓рдЧрдЗрдиреНрд╕: [
["рд░реВрдкрд╛рдВрддрд░рдг-рдкрд░рд┐рднрд╛рд╖рд┐рдд", рд╡рд╛рддрд╛рд╡рд░рдг],
["@babel/plugin-proposal-decorators", {рд╡рд┐рд░рд╛рд╕рдд: рд╕рдЪ }],
["@babel/plugin-proposal-class-properties", { рдвреАрд▓рд╛: рд╕рдЪ }],
["рдореЙрдбреНрдпреВрд▓-рд░рд┐рдЬрд╝реЙрд▓реНрд╡рд░", {рд░реВрдЯ: [./"] }]
],
рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ: рдЭреВрдареА,
рдХреЙрдореНрдкреИрдХреНрдЯ: рд╕рдЪ,
рдЫреЛрдЯрд╛ рдХрд┐рдпрд╛ рд╣реБрдЖ: рд╕рдЪ
}
}
};
````
рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЖрдк рд▓реЛрдЧ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЬрдпрдХрд╛рд░ред
@GeorgianSorinMaxim рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдореЗрд░рд╛ рдЬреЗрд╕реНрдЯ рдРрдк .babelrc
рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рддрд╛ рд╣реИ, рдФрд░ babel.config.js
рдмрджрд▓рдиреЗ рд╕реЗ рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рд╣реЛ рдЬрд╛рдПрдЧреА, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЗрд╕реЗ рд╡реИрд╕реЗ рднреА рд╣рд▓ рдХрд┐рдпрд╛, рдореЗрд░рд╛ рдЙрддреНрддрд░ рдЗрд╕ рдЯрд┐рдкреНрдкрдгреА рдХреЗ рдКрдкрд░ рд╣реИред
рдзрдиреНрдпрд╡рд╛рдж @GeorgianSorinMaxim @hoaiduyit рдЕрдВрдд рдореЗрдВ рдореИрдВрдиреЗ рдЗрд╕реЗ рдмрд╕
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдмреИрдмреЗрд▓ 7 рдХреЛ рдареАрдХ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП babel.config.js
рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдмрд╛рдмреЗрд▓рд░ рдХреЗ рдмрдЬрд╛рдп рдХрд░реЗрдВ
babel-jest
рдЕрднреА рднреА Babel 6 рд╕реЗ babel-core
рдореЗрдВ рдирд┐рд░реНрднрд░ рд╣реИ, рдпрджрд┐ рдЖрдк Babel 7 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
рдпрд╣ рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдорд░ рдмреЗрдмрд▓7-рдЬреЗрд╕реНрдЯ
babel-jest
рдмреЗрдмреЗрд▓ 7 рдХреЗ рд╕рд╛рде рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдХрд╕реНрдЯрдо рдЯреНрд░рд╛рдВрд╕рдлрд╛рд░реНрдорд░ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ
@SimenB рдореИрдВрдиреЗ рдЕрдкрдиреЗ .babelrc
рдХрд╛ рдирд╛рдо рдмрджрд▓рдХрд░ babel.config.js
рд▓реЗрдХрд┐рди рдпрд╣ рдЕрднреА рднреА рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдЯреЛрдХрди рдХреЗ рд╕рд╛рде рдЙрд╕ рддреНрд░реБрдЯрд┐ рдХреЛ рджрд┐рдЦрд╛рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ babel7-pre.42 рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдХреНрдпрд╛ рдХреЛрдИ рдЕрдиреНрдп рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЫреВрдЯреА рд╣реБрдИ рдЪреАрдЬреЗрдВ рд╣реИрдВ? :) рдзрдиреНрдпрд╡рд╛рджред
@alexindigo babel.config.js
рд▓рд┐рдЦрдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЗрд╕реЗ рджреЗрдЦреЗрдВ
рд╣рд╛рдБ, yarn upgrade --latest
рдЪрд▓рд╛рдиреЗ рд╕реЗ рд╕рдорд╕реНрдпрд╛ рдареАрдХ рд╣реЛ рдЧрдИ :)
@alexindigo @hoaiduyit рджреБрдирд┐рдпрд╛ рдореЗрдВ рдЖрдк рд╕рднреА рдиреЗ babel.config.js
рдмрд╛рд░реЗ рдореЗрдВ рдпрд╣ рдХреИрд╕реЗ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛? рдЙрд╕реА рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдЬреВрдЭрддреЗ рд╣реБрдП рдФрд░ рдЖрдкрдХреЗ рд╕рдорд╛рдзрд╛рди рдвреВрдВрдврддреЗ рд╣реБрдП, рдореИрдВ рдЕрдкрдиреЗ рдЖрдк рд╕реЗ рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛... _"рд╣рдореНрдо, рдХреЛрдИ рд░рд╛рд╕реНрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдХрд╛рдо рдХрд░реЗрдЧрд╛ рд▓реЗрдХрд┐рди рдореИрдВ рд╡реИрд╕реЗ рднреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдБрдЧрд╛ред"_ рд▓реЗрдХрд┐рди рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдпрд╣ рд▓реБрд▓реНрдЬрд╝ рдерд╛ред рдзрдиреНрдпрд╡рд╛рдж
рдЬреЗрд╕реНрдЯ рдФрд░ рдПрдВрдЬрд╛рдЗрдо рд╡рд┐рдиреНрдпрд╛рд╕: package.json рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдЬреЛрдбрд╝реЗрдВ:
"jest": {
"testEnvironment": "jsdom",
"moduleDirectories": [
"src",
"node_modules"
],
"moduleNameMapper": {
"\\.(css|scss)$": "<rootDir>/__mocks__/styleMock.js",
"\\.(jpg|gif|ttf|eot|svg)$": "<rootDir>/__mocks__/fileMock.js"
},
"transform": {
"^.+\\.(js|jsx)$": "babel-jest",
".+\\.(css|styl|less|sass|scss)$": "<rootDir>/node_modules/jest-css-modules-transform"
},
"setupTestFrameworkScriptFile": "<rootDir>/setupTests.js",
"setupFiles": [
"<rootDir>setup.js"
],
"moduleFileExtensions": [
"css",
"scss",
"js",
"json",
"jsx"
],
"testRegex": "\/test\/spec\/.*\\.js$",
"transformIgnorePatterns": [
"/node_modules/(?!test-component).+\\.js$"
]
}
рдПрдВрдЬрд╛рдЗрдо рдХреА рд╕реНрдерд╛рдкрдирд╛ рдХреЗ рд▓рд┐рдП => setup.js
import { configure } from 'enzyme'
import Adapter from 'enzyme-adapter-react-16'
configure({ adapter: new Adapter() })
setupTestFrameworkScriptFile рдХреЗ рд▓рд┐рдП: setupTests.js Global.fetch = рдЖрд╡рд╢реНрдпрдХрддрд╛ ('рдЬреЗрд╕реНрдЯ-рдлрд╝реЗрдЪ-рдореЙрдХ')
const { JSDOM } = require('jsdom')
const jsdom = new JSDOM('<!doctype html><html><body></body></html>')
const { window } = jsdom
const exposedProperties = ['window', 'navigator', 'document']
const { document } = new JSDOM('').window
global.document = document
global.window = document.defaultView
global.HTMLElement = window.HTMLElement
global.HTMLAnchorElement = window.HTMLAnchorElement
Object.keys(document.defaultView).forEach(property => {
if (typeof global[property] === 'undefined') {
exposedProperties.push(property)
global[property] = document.defaultView[property]
}
})
global.navigator = {
userAgent: 'node.js',
}
рдмрд╕ .tsx рдлрд╛рдЗрд▓реЗрдВ рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рддреА рд╣реИрдВ?
рд╕рд┐рд░реНрдл рдЦрдмрд░ рдлреИрд▓рд╛рддреЗ рд╣реБрдП, рдЬреЗрд╕реНрдЯ v24 рдХреЛ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рдмреИрдмреЗрд▓ 7 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, babel bridge
рдпрд╛ babel7-jest
рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдм рдФрд░ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП
https://twitter.com/i/web/status/1088904207653105664
рдореИрдВрдиреЗ .babelrc
рдХрд╛ рдирд╛рдо рдмрджрд▓рдХрд░ babel.config.js
рдХрд░ рджрд┐рдпрд╛ рдФрд░ Babel7 рдореЗрдВ рдЕрдкрдЧреНрд░реЗрдб рднреА рдХрд┐рдпрд╛ рдФрд░ рдЕрднреА рднреА рдкрд╣рд▓реЗ рдЬреИрд╕реА рд╣реА рддреНрд░реБрдЯрд┐ рд╣реИред рдореЗрд░реА babel.config.js
рдлрд╝рд╛рдЗрд▓:
module.exports = function (api) {
api.cache(true);
const presets = ["@babel/preset-env"];
return {
presets
};
}
рдореИрдВрдиреЗ @babel/preset-react
рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдФрд░ рдЗрд╕реЗ рдЕрдкрдиреА babel.config.js
рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЬреЛрдбрд╝рд╛ред рддреНрд░реБрдЯрд┐ рдХреЛ рдареАрдХ рдХрд┐рдпрд╛ред
рдореЗрд░реА babel.config.js
рдлрд╝рд╛рдЗрд▓ рдХреЛ babel-jest
рджреНрд╡рд╛рд░рд╛ рдкрддрд╛ рдирд╣реАрдВ рдЪрд▓ рд░рд╣рд╛ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВрдиреЗ рдЗрд╕реЗ __test__
рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЗ рдЕрдВрджрд░ рд░рдЦрд╛ рдерд╛ред рдореИрдВрдиреЗ рдЗрд╕реЗ рд╢реАрд░реНрд╖ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд▓реЗ рдЬрд╛рдпрд╛ рдЬрд╣рд╛рдВ package.json
рд╕реНрдерд┐рдд рдерд╛ рдФрд░ рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рддрд╛ рдерд╛ред
рдореИрдВрдиреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдп рдХрд░рдХреЗ рдЗрд╕реА рддрд░рд╣ рдХреА рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рдХреА:
1- рдПрдВрдЬрд╛рдЗрдо рд╕реЗрдЯрдЕрдк рдлрд╛рдЗрд▓ рдЬреЛрдбрд╝реЗрдВ рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓рд┐рдЦреЗрдВ:
import Enzyme from 'enzyme';
import Adapter from 'enzyme-adapter-react-16';
Enzyme.configure({ adapter: new Adapter() });
2- рдЕрдкрдиреЗ рдкреИрдХреЗрдЬ рдореЗрдВ рдЬреЗрд╕реНрдЯ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдЬреЛрдбрд╝реЗрдВред рдЬрд╕рди рдЗрд╕ рддрд░рд╣:
"jest": {
"setupFilesAfterEnv": [
"./path to your setup file/setupEnzyme.js"
]
}
3- рдЕрдкрдиреЗ рд░реВрдЯ рдкрде рдореЗрдВ .babelrc рдлрд╝рд╛рдЗрд▓ рдЬреЛрдбрд╝реЗрдВ рдФрд░ рдЙрд╕рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓рд┐рдЦреЗрдВ:
{
"env": {
"test": {
"presets": [
"@babel/preset-env",
"@babel/preset-react"
]
}
}
}
4- рдпрджрд┐ рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ "рдЙрдореНрдореАрдж" рдХреАрд╡рд░реНрдб рдкрд░ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдорд┐рд▓реА рд╣реИ рддреЛ рдмрд╕ npm install -D chai
рдЪрд▓рд╛рдПрдВ рдФрд░ рдЕрдкрдиреЗ рдкрд░реАрдХреНрд╖рдг рдХреЛрдб рдореЗрдВ рдЕрдкреЗрдХреНрд╖рд┐рдд рдлрд╝рдВрдХреНрд╢рди рдЖрдпрд╛рдд рдХрд░реЗрдВ рдЬреИрд╕реЗ import { expect } from 'chai';
рдЕрдЧрд░ рдЖрдкрдХреЛ рдЕрднреА рднреА рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИ рддреЛ рдЙрд╕ рддрд░рд╣ рдХреА рдмреЗрдмреЗрд▓ рдирд┐рд░реНрднрд░рддрд╛рдПрдВ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ npm install -D @babel/core @babel/preset-env @babel/preset-react
рдЙрдореНрдореАрдж рд╣реИ рдпреЗ рдорджрдж рдХрд░реЗрдЧрд╛ред
3 рджрд┐рдиреЛрдВ рдХреЗ рдмрд╛рдж, рдореИрдВ рдмрд╕ рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рд╕рдорд╛рдзрд╛рди рдвреВрдВрдврддрд╛ рд╣реВрдВред
рдЗрд╕рдХреЗ рд▓рд┐рдП 2 рд╕рдорд╛рдзрд╛рди рд╣реИрдВ:рд╕рдорд╛рдзрд╛рди 1:
рдЖрдк рдЕрдкрдиреА рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдирд╛рдо
.babelrc
рд╕реЗbabel.config.js
, рдФрд░ рдпрд╣ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред
рдореЗрд░реЗ рдкрд╛рд╕ .babelrc рдлрд╝рд╛рдЗрд▓ рдирд╣реАрдВ рдереА рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрд╛ рдХрд┐ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп babel.config.js рд╕реЗ рдкреВрд░реНрд╡ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ .babelrc рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдИред (рдореИрдВрдиреЗ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдИ, рдореИрдВрдиреЗ рдореВрд▓ рдХрд╛ рдирд╛рдо рдирд╣реАрдВ рдмрджрд▓рд╛)
рдлрд┐рд░ рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдиреЗ рдкрд░ рдореБрдЭреЗ рдПрдХ рдирдИ рддреНрд░реБрдЯрд┐ рдорд┐рд▓реА: Requires Babel "^7.0.0-0", but was loaded with "6.26.3"
ред
рдореИрдВрдиреЗ рдЙрд╕ рддреНрд░реБрдЯрд┐ рдХреЛ рдЧреБрдЧрд▓ рдХрд┐рдпрд╛ рдФрд░ рдпрд╣ рдореБрдЭреЗ рдпрд╣рд╛рдВ рд▓реЗ рдЧрдпрд╛ ред рдореИрдВрдиреЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд┐рдпрд╛ ( npm install [email protected]
) рдФрд░ рдкрд░реАрдХреНрд╖рдг рдЕрдм рдЪрд▓ рд░рд╣рд╛ рд╣реИ рдФрд░ рдЧреБрдЬрд░ рд░рд╣рд╛ рд╣реИред
рд╕рд┐рд░реНрдл рдЦрдмрд░ рдлреИрд▓рд╛рддреЗ рд╣реБрдП, рдЬреЗрд╕реНрдЯ v24 рдХреЛ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рдмреИрдмреЗрд▓ 7 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛,
babel bridge
рдпрд╛babel7-jest
рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдм рдФрд░ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП
https://twitter.com/i/web/status/1088904207653105664
рдЬреЗрд╕реНрдЯ v24 рдореЗрдВ рдЕрдкрдЧреНрд░реЗрдб рдХрд░рдиреЗ рд╕реЗ рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдареАрдХ рд╣реЛ рдЧрдИ :)
рдХреЗ рд▓рд┐рдП unexpected token
рддреНрд░реБрдЯрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛
> 10 | const browser;
(рдЕрдВрдд рдореЗрдВ рдЕрд░реНрдзрд╡рд┐рд░рд╛рдо)
рдореЗрд░рд╛ рдкреИрдХреЗрдЬ.рдЬреЗрд╕рди
"dependencies": {
"@babel/cli": "^7.2.3",
"@babel/core": "^7.3.4",
"@babel/register": "^7.0.0",
"assert": "^1.4.1",
"chai": "^4.2.0",
"jest-puppeteer": "^4.0.0",
"screen-info": "^1.0.1",
"screenres": "^2.0.1"
},
"devDependencies": {
"@babel/plugin-transform-modules-commonjs": "^7.2.0",
"@babel/preset-env": "^7.3.4",
"babel-jest": "^24.5.0",
"babel-preset-env": "^1.7.0",
"babel-preset-jest": "^24.3.0",
"jest": "^24.5.0",
"jest-cli": "^24.5.0",
"puppeteer": "^1.13.0"
},
"jest": {
"transformIgnorePatterns": [
"/node_modules/(?!@babel).+\\.js$"
],
"transform": {
"^.+\\.js?$": "babel-jest"
}
},
рдмреЗрдмрд▓.config.js
module.exports = {
presets: [
[
'@babel/preset-env',
{
targets: {
node: 'current'
},
},
'jest'
]
],
env: {
test: {
plugins: ['@babel/plugin-transform-modules-commonjs']
}
}
}
рдкрд░реАрдХреНрд╖рдг hoaiduyit рд╕рдорд╛рдзрд╛рдиред рдпреЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдореБрдЭреЗ рдмрд╕ babel.config.js рдЬреЛрдбрд╝рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ, babel-jest
рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдо/рдЯреНрд░рд╛рдВрд╕рдкрд╛рдЗрд▓ рдЬреЗрд╕реНрдЯ рдХреЛ jest.config.js рдореЗрдВ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдВ
3 рджрд┐рдиреЛрдВ рдХреЗ рдмрд╛рдж, рдореИрдВ рдмрд╕ рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рд╕рдорд╛рдзрд╛рди рдвреВрдВрдврддрд╛ рд╣реВрдВред
рдЗрд╕рдХреЗ рд▓рд┐рдП 2 рд╕рдорд╛рдзрд╛рди рд╣реИрдВ:рд╕рдорд╛рдзрд╛рди 1:
рдЖрдк рдЕрдкрдиреА рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдирд╛рдо
.babelrc
рд╕реЗbabel.config.js
, рдФрд░ рдпрд╣ рдХрд╛рдо рдХрд░реЗрдЧрд╛редрд╕рдорд╛рдзрд╛рди 2:
рдореИрдВ рдЗрд╕ рддрд░рд╣ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдБред
рдЗрд╕ рддрд░рд╣ рдПрдХ рдЯреНрд░рд╛рдВрд╕рдлрд╝реЙрд░реНрдо рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБ (рдореЗрд░рд╛ рд╣реИjest-transforme.js
):const config = { babelrc: false, presets: [ [ "@babel/env", { modules: false } ], "@babel/react" ], plugins: [ ["@babel/plugin-proposal-decorators", { legacy: true }], ["@babel/plugin-proposal-class-properties", { loose: true }], "transform-es2015-modules-commonjs" ] }; module.exports = require("babel-jest").createTransformer(config);
рдпрд╣рд╛рдБ рдореЗрд░рд╛
jest.config.js
:module.exports = { collectCoverageFrom: ["src/**/*.{js,jsx,mjs}"], testMatch: ["<rootDir>/src/**/__tests__/**/*.{js,jsx,mjs}", "<rootDir>/src/**/?(*.)(spec|test).{js,jsx,mjs}"], transform: { "^.+\\.(js|jsx|mjs)$": "<rootDir>/config/jest/jest-transformer.js" }, transformIgnorePatterns: ["[/\\\\]node_modules[/\\\\].+\\.(js|jsx|mjs)$"] };
рдФрд░ рдореЗрд░реЗ рдкрд╛рд╕ рдЕрднреА рднреА рдореЗрд░рд╛
.babelrc
const enviroments = require("./env-config.js"); module.exports = { presets: [ [ "next/babel", { "preset-env": { useBuiltIns: "entry" } } ] ], plugins: [ ["styled-components", { ssr: true, displayName: true, preprocess: false }], [ "module-resolver", { root: ["./"] } ] ], env: { dev: { plugins: [ ["transform-define", enviroments], ["module-resolver", { root: ["./"] }], "transform-decorators-legacy", "transform-class-properties" ] }, build: { plugins: [ ["transform-define", enviroments], ["module-resolver", { root: ["./"] }], "transform-decorators-legacy", "transform-class-properties" ] }, production: { presets: [ [ "minify", // why add minify here, we run uglify over the whole code bundles { mangle: false, evaluate: false } ] ], plugins: [ ["transform-define", enviroments], ["@babel/plugin-proposal-decorators", { legacy: true }], ["@babel/plugin-proposal-class-properties", { loose: true }], ["module-resolver", { root: ["./"] }] ], comments: false, compact: true, minified: true } } };
рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЖрдк рд▓реЛрдЧ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЬрдпрдХрд╛рд░ред
рдЖрдкрдХреА рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП tks ~ рдпрд╣ рд╡рд┐рдзрд┐ рдореЗрд░реА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдареАрдХ рдХрд░ рд╕рдХрддреА рд╣реИ!
рдирдорд╕реНрддреЗ - рдореИрдВрдиреЗ рдЗрд╕ рдзрд╛рдЧреЗ рдореЗрдВ рдХрдИ рдЪреАрдЬреЛрдВ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред рдореБрдЦреНрдп рддреНрд░реБрдЯрд┐ рдЕрдЬреАрдм рдмреА/рд╕реА рд╣реИ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд▓рд╛рдЗрди рдирдВрдмрд░реЛрдВ рдкрд░ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рд╣реИ, рд▓рдЧрднрдЧ рд╕реНрд░реЛрдд рдХреЛрдб рдХреА рддрд░рд╣ рдФрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдб рдЪрд▓рд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИ, рд╕рдВрд░реЗрдЦрд┐рдд рдирд╣реАрдВ рд╣реИ ..
рдпрд╣ рддреНрд░реБрдЯрд┐, рдЬреЗрд╕реНрдЯ рдХреЛ рдПрдХ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдЯреЛрдХрди рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛, рдмрдиреА рд╣реБрдИ рд╣реИред рдореИрдВ рдЬреЗрд╕реНрдЯ> 24 рдкрд░ рд╣реВрдВ, рдХреЛрдИ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдПрдХ рдмреЗрджрдЦрд▓ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдирд┐рд░реНрдорд╛рдг-рдРрдк рд╣реИ (6 рдорд╣реАрдиреЗ рдкрд╣рд▓реЗ ~)ред рдХреИрд╢ рд╕рд╛рдлрд╝ рдХрд░рдиреЗ рдФрд░ node_modules рдХреЛ рд╣рдЯрд╛рдиреЗ рд╕реЗ рдорджрдж рдирд╣реАрдВ рдорд┐рд▓реАред рд╢рд╛рдпрдж рдХреЛрдИ рдпрд╣ рдмрддрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЬреЗрд╕реНрдЯ рдХреЛ рдареАрдХ рд╕реЗ рдмрджрд▓рдиреЗ рдФрд░ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рдореЗрд░реА рд╕рдЯреАрдХ рддреНрд░реБрдЯрд┐ рдХреНрдпрд╛ рд╕рдВрдХреЗрдд рджреЗрддреА рд╣реИ ...
FAIL __e2e__/chat/sms.spec.js
тЧП Test suite failed to run
Jest encountered an unexpected token
This usually means that you are trying to import a file which Jest cannot parse, e.g. it's not plain JavaScript.
By default, if Jest sees a Babel config, it will use that to transform your files, ignoring "node_modules".
Here's what you can do:
тАв To have some of your "node_modules" files transformed, you can specify a custom "transformIgnorePatterns" in your config.
тАв If you need a custom transformation specify a "transform" option in your config.
тАв If you simply want to mock your non-JS modules (e.g. binary assets) you can stub them out with the "moduleNameMapper" config option.
You'll find more details and examples of these config options in the docs:
https://jestjs.io/docs/en/configuration.html
Details:
/Users/ben/dev/app/webui/node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js:17
export default function _asyncToGenerator(fn) {
^^^^^^
SyntaxError: Unexpected token export
5 | afterEach(async () => {
6 | await logout();
> 7 |
| ^
8 | await page.evaluate(() => {
9 | localStorage.clear();
10 | });
at ScriptTransformer._transformAndBuildScript (node_modules/@jest/transform/build/ScriptTransformer.js:471:17)
at ScriptTransformer.transform (node_modules/@jest/transform/build/ScriptTransformer.js:513:25)
at Object.<anonymous> (__e2e__/chat/sms.spec.js:7:49)
рдЖрдк рд╕рднреА рдХреЛ рдзрдиреНрдпрд╡рд╛рдж,
рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рдХрд╛рд░рдг рдЬреЗрдирдХреАрдВрд╕ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИ, рдХреНрдпрд╛ рдХреБрдЫ рд╕рдорд╛рдзрд╛рди рд╣реИрдВ?
Create-React-App рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП, рдЕрдкрдиреЗ package.json рдореЗрдВ transformignorepatterns
рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ CRA рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп package.json рдореЗрдВ рдХреЗрд╡рд▓ рдХреБрдЫ рдЬреЗрд╕реНрдЯ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдореБрдЭреЗ рдЬреЗрд╕реНрдЯ рдХреЗ рд╕рд╛рде рдПрдХ рдЖрдВрддрд░рд┐рдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд▓реЗрдиреЗ рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рдереА, рдЬреЗрд╕реНрдЯ 'рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдЯреЛрдХрди' рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдЧрд╛ рдЬрд╣рд╛рдБ рднреА рдореЗрд░реЗ рдкрд╛рд╕ рдЗрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реЗ рдореЗрд░рд╛ рдЖрдпрд╛рдд рдерд╛ред
рдЗрд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдЕрдкрдиреА рдЯреЗрд╕реНрдЯ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдиреАрдЪреЗ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ:
"test": "react-scripts test --transformIgnorePatterns 'node_modules/(?!(<your-package-goes-here>)/)'",
рд╣рд╛рдп рд╕рдм, рдореИрдВ рдЕрдкрдиреЗ рдЫреЛрдЯреЗ рд╕реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рдпреВрдирд┐рдЯ рдЯреЗрд╕реНрдЯрд┐рдВрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдШрд░реНрд╖ рдХрд░ рд░рд╣рд╛ рдерд╛ рдЬрд┐рд╕реЗ рдЬреЗрдЯрд╕реЗрдЯ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд░рд┐рдПрдХреНрдЯ рдиреЗрдЯрд┐рд╡ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред рдореИрдВрдиреЗ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП 2 рджрд┐рдиреЛрдВ рдХреА рдЦреЛрдЬ рдХреА, рдФрд░ рдореИрдВрдиреЗ babel.config.js рдЬреИрд╕реА рдЪреАрдЬреЛрдВ рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдиреЗ, рдЙрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╣рдЯрд╛рдиреЗ рдФрд░ рдлрд┐рд░ .babel рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдиреЗ (рдФрд░ рдХреБрдЫ рд╢рд┐рдЯреНрд╕ рдЬреЛрдбрд╝рдиреЗ) рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдереАред
_рдмрдЧ рд░рд┐рдкреЛрд░реНрдЯ:_
D:\jetset\JetSetApp>Jest SaveData.test.js
рд╡рд┐рдлрд▓ __test__/SaveData.test.js
рдЯреЗрд╕реНрдЯ рд╕реВрдЯ рдЪрд▓рдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ рд░рд╣рд╛
Jest encountered an unexpected token
This usually means that you are trying to import a file which Jest cannot parse, e.g. it's not plain JavaScript.
By default, if Jest sees a Babel config, it will use that to transform your files, ignoring "node_modules".
Here's what you can do:
тАв To have some of your "node_modules" files transformed, you can specify a custom "transformIgnorePatterns" in your config.
тАв If you need a custom transformation specify a "transform" option in your config.
тАв If you simply want to mock your non-JS modules (e.g. binary assets) you can stub them out with the "moduleNameMapper" config option.
You'll find more details and examples of these config options in the docs:
https://jestjs.io/docs/en/configuration.html
Details:
D:\jetset\JetSetApp\node_modules\expo-file-system\build\index.js:1
({"Object.<anonymous>":function(module,exports,require,__dirname,__filename,global,jest){import * as FileSystem from './FileSystem';
^
SyntaxError: Unexpected token *
1 | import React, { Component } from 'react'
2 | import { View, Text, TouchableOpacity, TextInput, StyleSheet } from 'react-native'
> 3 | import { documentDirectory, getInfoAsync, readDirectoryAsync, readAsStringAsync, writeAsStringAsync, deleteAsync } from 'expo-file-system';
| ^
4 |
5 | /**
6 | * This class primarily serves to handle files within the phone system so that results can be stored
at ScriptTransformer._transformAndBuildScript (node_modules/@jest/transform/build/ScriptTransformer.js:537:17)
at ScriptTransformer.transform (node_modules/@jest/transform/build/ScriptTransformer.js:579:25)
at Object.<anonymous> (app/resources/SaveData/SaveData.js:3:1)
рдЯреЗрд╕реНрдЯ рд╕реВрдЯ: 1 рд╡рд┐рдлрд▓, 1 рдХреБрд▓
рдЯреЗрд╕реНрдЯ: 0 рдХреБрд▓
рд╕реНрдиреИрдкрд╢реЙрдЯ: рдХреБрд▓ 0
рд╕рдордп: 3.509s
/SaveData.test.js/i рд╕реЗ рдореЗрд▓ рдЦрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдкрд░реАрдХреНрд╖рдг рд╕реВрдЯ рдЪрд▓рд╛рдПрдВред
_ рдмреЗрдмрд▓.config.js _
рдореЙрдбреНрдпреВрд▓.рдПрдХреНрд╕рдкреЛрд░реНрдЯреНрд╕ = рдлрд╝рдВрдХреНрд╢рди (рдПрдкреАрдЖрдИ) {
api.cache (рд╕рдЪ);
рд╡рд╛рдкрд╕реА {
рдкреНрд░реАрд╕реЗрдЯ: ['рдмреЗрдмреЗрд▓-рдкреНрд░реАрд╕реЗрдЯ-рдПрдХреНрд╕рдкреЛ'],
};
};
_ рдкреИрдХреЗрдЬ.рдЬреЗрд╕рди _
{
"рдореБрдЦреНрдп": "рдиреЛрдб_рдореЙрдбреНрдпреВрд▓реНрд╕/рдПрдХреНрд╕рдкреЛ/AppEntry.js",
"рд╕реНрдХреНрд░рд┐рдкреНрдЯ": {
"рдкреНрд░рд╛рд░рдВрдн": "рдПрдХреНрд╕рдкреЛ рдкреНрд░рд╛рд░рдВрдн",
"рдПрдВрдбреНрд░реЙрдЗрдб": "рдПрдХреНрд╕рдкреЛ рд╕реНрдЯрд╛рд░реНрдЯ --рдПрдВрдбреНрд░реЙрдЗрдб",
"ios": "рдПрдХреНрд╕рдкреЛ рд╕реНрдЯрд╛рд░реНрдЯ --ios",
"рд╡реЗрдм": "рдПрдХреНрд╕рдкреЛ рд╕реНрдЯрд╛рд░реНрдЯ --рд╡реЗрдм",
"рдЗрдЬреЗрдХреНрдЯ": "рдПрдХреНрд╕рдкреЛ рдЗрдЬреЗрдХреНрдЯ",
"рдЯреЗрд╕реНрдЯ": "рдЬрд╕реНрдЯ"
},
"рдордЬрд╛рдХ": {
"рдкреНрд░реАрд╕реЗрдЯ": "рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдореВрд▓"
},
"рдирд┐рд░реНрднрд░рддрд╛": {
"рдПрдХреНрд╕рдкреЛ": "^34.0.1",
"рдПрдХреНрд╕рдкреЛ-рдлрд╛рдЗрд▓-рд╕рд┐рд╕реНрдЯрдо": "^6.0.2",
"рдПрдХреНрд╕рдкреЛ-рдореЗрд▓-рдХрдВрдкреЛрдЬрд╝рд░": "^6.0.0",
"рдкрд▓": "^2.24.0",
"рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛": "16.8.3",
"рд░рд┐рдПрдХреНрд╢рди-рдбреЛрдо": "^16.8.6",
"рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдореВрд▓": " https://github.com/expo/react-native/archive/sdk-34.0.0.tar.gz ",
"рд░рд┐рдПрдХреНрд╢рди-рдиреЗрдЯрд┐рд╡-рдЬреЗрд╕реНрдЪрд░-рд╣реИрдВрдбрд▓рд░": "^1.3.0",
"рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдореВрд▓-рдЪрдпрди-рд╕рдореВрд╣": "^ 1.1.2",
"рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдореВрд▓-рд╡реЗрдм": "^0.11.4"
},
"рджреЗрд╡ рдирд┐рд░реНрднрд░рддрд╛": {
"@ рдмреЗрдмреЗрд▓/рдХреЛрд░": "^7.6.2",
"@ рдмреЗрдмреЗрд▓/рдкреНрд░реАрд╕реЗрдЯ-рдПрдирд╡реА": "^7.6.2",
"рдмреЗрдмреЗрд▓-рдЬреЗрд╕реНрдЯ": "^24.9.0",
"рдмреЗрдмреЗрд▓-рдкреНрд░реАрд╕реЗрдЯ-рдПрдХреНрд╕рдкреЛ": "^6.0.0",
"рдЬреЗрд╕реНрдЯ": "^24.9.0",
"рдкреНрд░реЛрдк-рдЯрд╛рдЗрдкреНрд╕": "^15.7.2",
"рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдореВрд▓-рдЦрд╛рд░рд┐рдЬ-рдХреАрдмреЛрд░реНрдб": "^ 1.0.0",
"рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдореВрд▓-рдореЛрдбрд▓-рдбреЗрдЯрд╛рдЯрд╛рдЗрдо-рдкрд┐рдХрд░": "^7.5.0",
"рд░рд┐рдПрдХреНрд╢рди-рдиреЗрд╡рд┐рдЧреЗрд╢рди": "^3.12.1"
},
"рдирд┐рдЬреА": рд╕рдЪ
}
рдПрдлрд╡рд╛рдИрдЖрдИ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдордиреЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореВрд░реНрдЦрддрд╛рдкреВрд░реНрдг рд╕рдорд╛рдзрд╛рди рдвреВрдВрдв рд▓рд┐рдпрд╛, рдЬреИрд╕реЗ рд╕рдВрдкреВрд░реНрдг рдирд┐рд░реНрдорд╛рдг рдкреНрд░рдгрд╛рд▓реА рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдирд╣реАрдВ рдХрд░ рд░рд╣реА рдереА рдпрджрд┐ NODE_ENV = "test" рд╕реЗрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рд░рд┐рдПрдХреНрдЯ рдЬреЗрд╕реНрдЯ рдХреЗ рдирдП рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рдЗрд╕рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ package.json рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП
"test": "react-scripts test"
рдХреА рдмрдЬрд╛рдп
"test": "jest"
рд░рд┐рдПрдХреНрдЯ рдЬреЗрд╕реНрдЯ рдХреЗ рдирдП рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рдЗрд╕рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ package.json рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП
"test": "react-scripts test"
рдХреА рдмрдЬрд╛рдп
"test": "jest"
рдмрд╣реБрдд рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж, рдЗрд╕рдиреЗ рдореЗрд░реЗ рд▓рд┐рдП рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╣рд▓ рдХрд░ рджрд┐рдпрд╛!
рдмрд╣реБрдд рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдореЗрд░реЗ рд▓рд┐рдП рд╕рдорд╕реНрдпрд╛:
.babelrc рдлрд╝рд╛рдЗрд▓ рдкрд░ "transform-es2015-modules-commonjs",
рдЧреБрдо рд╣реИ
{
"presets": ["next/babel"],
"plugins": [
["styled-components", { "ssr": true, "displayName": true, "preprocess": false } ],
"transform-flow-strip-types",
"jsx-control-statements",
"import-glob",
"transform-es2015-modules-commonjs",
[
"import",
{
"libraryName": "antd",
"style": "css"
}
]
]
}
"рдЬреЗрд╕реНрдЯ": "^24.9.0",
"рдмреЗрдмреЗрд▓-рдЬреЗрд╕реНрдЯ": "23.6.0",
рдЕрдкрдиреЗ рдордЬрд╝рд╛рдХ рдФрд░ рдмреЗрдмрд▓-рдЬреЗрд╕реНрдЯ рдХреЛ рдЕрджреНрдпрддрди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ
рдореИрдВрдиреЗ
.babelrc
рдХрд╛ рдирд╛рдо рдмрджрд▓рдХрд░babel.config.js
рдХрд░ рджрд┐рдпрд╛ рдФрд░ Babel7 рдореЗрдВ рдЕрдкрдЧреНрд░реЗрдб рднреА рдХрд┐рдпрд╛ рдФрд░ рдЕрднреА рднреА рдкрд╣рд▓реЗ рдЬреИрд╕реА рд╣реА рддреНрд░реБрдЯрд┐ рд╣реИред рдореЗрд░реАbabel.config.js
рдлрд╝рд╛рдЗрд▓:module.exports = function (api) { api.cache(true); const presets = ["@babel/preset-env"]; return { presets }; }
рдореИрдВрдиреЗ
@babel/preset-react
рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдФрд░ рдЗрд╕реЗ рдЕрдкрдиреАbabel.config.js
рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЬреЛрдбрд╝рд╛ред рддреНрд░реБрдЯрд┐ рдХреЛ рдареАрдХ рдХрд┐рдпрд╛ред
рдЗрд╕рдиреЗ рдореЗрд░реА рд╕рдорд╕реНрдпрд╛ рдХреЛ рдареАрдХ рдХрд░ рджрд┐рдпрд╛, рдореИрдВрдиреЗ @ рдмреЗрдмреЗрд▓/рдкреНрд░реАрд╕реЗрдЯ-рдПрдирд╡реА рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдФрд░ babel.config.js рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдФрд░ рдпрд╣ рдареАрдХ рд╣реЛ рдЧрдпрд╛
рдзрдиреНрдпрд╡рд╛рдж @jmayergit
рдореИрдВрдиреЗ babel.rc рдлрд╝рд╛рдЗрд▓ рдХреЛ babel.config.js рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рдерд╛ рд▓реЗрдХрд┐рди рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣реА рдереАред рддрдм рдореИрдВрдиреЗ рдпрд╣ рдЙрддреНрддрд░ рджреЗрдЦрд╛: https://stackoverflow.com/questions/58470062/test-jest-with-babel-plugin-import
рдпрджрд┐ рдХрд┐рд╕реА рдХреЗ рдкрд╛рд╕ рдЖрдпрд╛рдд рдкреНрд▓рдЧрдЗрдиреНрд╕ рд╣реИрдВ, рддреЛ рдкрд░реАрдХреНрд╖рдг, рджреЗрд╡ рдФрд░ рдЙрддреНрдкрд╛рджрди рд╡рд╛рддрд╛рд╡рд░рдг рдХреЗ рд▓рд┐рдП рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХреЛ рдЕрд▓рдЧ рдХрд░реЗрдВред
рдореЗрд░реА babel.config.js рдлрд╝рд╛рдЗрд▓ рдЕрдм рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреА рд╣реИ рдЬреЛ рдХрд╛рдо рдХрд░рддреА рд╣реИ:
module.exports = {
presets: [
[
'next/babel',
],
],
env: {
test: {
},
dev: {
plugins: [
['import', { libraryName: 'antd', style: 'css' }],
],
},
production: {
plugins: [
['import', { libraryName: 'antd', style: 'css' }],
],
},
},
};
рдореИрдВ рднреА 5 рджрд┐рдиреЛрдВ рд╕реЗ рдЗрд╕ рддреНрд░реБрдЯрд┐ рд╕реЗ рдЬреВрдЭ рд░рд╣рд╛ рд╣реВрдВ
Jest encountered an unexpected token
This usually means that you are trying to import a file which Jest cannot parse, e.g. it's not plain JavaScript.
By default, if Jest sees a Babel config, it will use that to transform your files, ignoring "node_modules".
Here's what you can do:
тАв To have some of your "node_modules" files transformed, you can specify a custom "transformIgnorePatterns" in your config.
тАв If you need a custom transformation specify a "transform" option in your config.
тАв If you simply want to mock your non-JS modules (e.g. binary assets) you can stub them out with the "moduleNameMapper" config option.
You'll find more details and examples of these config options in the docs:
https://jestjs.io/docs/en/configuration.html
Details:
SyntaxError: C:\Users\SK-PC\Desktop\React-Course\expansify\src\test\components\MyNavbar.test.js: Unexpected token (5:28)
3 | import { MyNavbar } from '../../components/MyNavbar'
4 | test("Should return MyNavbar component", () => {
> 5 | const wrapper = shallow(<MyNavbar />)
| ^
6 | expect(wrapper.find('.navbar-brand').find('kbd').text()).toBe("Expensify")
7 | // const renderer = new ReactShallowRenderer()
8 | // renderer.render(<MyNavbar />)
at Parser._raise (node_modules/@babel/parser/src/parser/location.js:241:45)
at Parser.raiseWithData (node_modules/@babel/parser/src/parser/location.js:236:17)
at Parser.raise (node_modules/@babel/parser/src/parser/location.js:220:17)
at Parser.unexpected (node_modules/@babel/parser/src/parser/util.js:149:16)
at Parser.parseExprAtom (node_modules/@babel/parser/src/parser/expression.js:1144:20)
at Parser.parseExprSubscripts (node_modules/@babel/parser/src/parser/expression.js:539:23)
at Parser.parseMaybeUnary (node_modules/@babel/parser/src/parser/expression.js:519:21)
at Parser.parseExprOps (node_modules/@babel/parser/src/parser/expression.js:311:23)
at Parser.parseMaybeConditional (node_modules/@babel/parser/src/parser/expression.js:263:23)
at Parser.parseMaybeAssign (node_modules/@babel/parser/src/parser/expression.js:211:21)
PASS src/test/reducers/filters.test.js
Test Suites: 1 failed, 5 passed, 6 total
Tests: 29 passed, 29 total
Snapshots: 0 total
Time: 12.144s
Ran all test suites.
@fullstacks
рд░рд┐рдПрдХреНрдЯ рдЬреЗрд╕реНрдЯ рдХреЗ рдирдП рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рдЗрд╕рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ package.json рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП
"test": "react-scripts test"
рдХреА рдмрдЬрд╛рдп
"test": "jest"
рдЖрдк рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдпрд╣рд╛рдВ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ:
https://jestjs.io/docs/hi/tutorial-react
https://create-react-app.dev/docs/running-tests/#docsNav
@ Catmans1
рдореИрдВрдиреЗ рдХреНрд░рд┐рдПрдЯ-рд░рд┐рдПрдХреНрд╢рди-рдРрдк рдпрд╛ рд░рд┐рдПрдХреНрдЯ-рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЬреИрд╕реА рдирд┐рд░реНрднрд░рддрд╛рдПрдВ рд╕реНрдерд╛рдкрд┐рдд рдирд╣реАрдВ рдХреА рд╣реИрдВред
рдХреНрдпрд╛ рдпреЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛?
"test": "react-scripts test"
рдХреА рдмрдЬрд╛рдп
"test": "jest"
рдЕрдм рдпрд╣ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ, рдЬрдм рдореИрдВрдиреЗ env рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╕рд╛рде рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдХрд▓реНрдк рдХреЗ рд▓рд┐рдП рдмреЗрдмреЗрд▓-рдкреНрд░реАрд╕реЗрдЯ-рдЬреЗрд╕реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред рдореИрдВрдиреЗ рдмреЗрдмреЗрд▓-рдЬреЗрд╕реНрдЯ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рд╣реИред
рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд┐рдпрд╛: babel.config.js
рдкрд░ "@babel/preset-react" рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВ
https://medium.com/@audreyhal/how -to-solve-jest-error-with-create-react-app-part-1-80f33aa1661a
рдореИрдВрдиреЗ рдпрд╣ рддреНрд░реБрдЯрд┐ рдПрдХ рдореВрд░реНрдЦрддрд╛рдкреВрд░реНрдг рдЧрд▓рддреА рдХрд░рдиреЗ рдФрд░ .tsx
рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рдмрдЬрд╛рдп .ts
рд╕рд╛рде рдЕрдкрдиреА рдкрд╣рд▓реА рдкрд░реАрдХреНрд╖рдг рдлрд╝рд╛рдЗрд▓ рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрд╛рдж рджреЗрдЦреАред рдореВрд▓ рдореБрджреНрджреЗ рд╕реЗ рдмрд╣реБрдд рджреВрд░ рд▓реЗрдХрд┐рди рдореИрдВ рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рдорджрджрдЧрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
3 рджрд┐рдиреЛрдВ рдХреЗ рдмрд╛рдж, рдореИрдВ рдмрд╕ рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рд╕рдорд╛рдзрд╛рди рдвреВрдВрдврддрд╛ рд╣реВрдВред
рдЗрд╕рдХреЗ рд▓рд┐рдП 2 рд╕рдорд╛рдзрд╛рди рд╣реИрдВ:
рд╕рдорд╛рдзрд╛рди 1:
рдЖрдк рдЕрдкрдиреА рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдирд╛рдо
.babelrc
рд╕реЗbabel.config.js
, рдФрд░ рдпрд╣ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред## рд╕рдорд╛рдзрд╛рди 2:
рдореИрдВ рдЗрд╕ рддрд░рд╣ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдБред
рдЗрд╕ рддрд░рд╣ рдПрдХ рдЯреНрд░рд╛рдВрд╕рдлрд╝реЙрд░реНрдо рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБ (рдореЗрд░рд╛ рд╣реИ
jest-transforme.js
):рдпрд╣рд╛рдБ рдореЗрд░рд╛
jest.config.js
:рдФрд░ рдореЗрд░реЗ рдкрд╛рд╕ рдЕрднреА рднреА рдореЗрд░рд╛
.babelrc
```
рдХреЙрдиреНрд╕реНрдЯ рдПрдирд╡рд╛рдпрд░рдореЗрдВрдЯ = рдЖрд╡рд╢реНрдпрдХрддрд╛ ("./env-config.js");
рдореЙрдбреНрдпреВрд▓.рдПрдХреНрд╕рдкреЛрд░реНрдЯ = {
рдкреНрд░реАрд╕реЗрдЯ: [
[
"рдЕрдЧрд▓рд╛/рдмреЗрдмреЗрд▓",
{
"рдкреНрд░реАрд╕реЗрдЯ-рдПрдирд╡реА": {
рдмрд┐рд▓реНрдЯрдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ: "рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐"
}
}
]
],
рдкреНрд▓рдЧрдЗрдиреНрд╕: [
["рд╕реНрдЯрд╛рдЗрд▓-рдШрдЯрдХ", {рдПрд╕рдПрд╕рдЖрд░: рд╕рдЪ, рдкреНрд░рджрд░реНрд╢рди рдирд╛рдо: рд╕рдЪ, рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕: рдЭреВрдард╛}],
[
"рдореЙрдбреНрдпреВрд▓-рд░рд┐рдЬрд╝реЙрд▓реНрд╡рд░",
{
рдЬрдбрд╝: ["ред/"]
}
]
],
рдкрд░реНрдпрд╛рд╡рд░рдг: {
рджреЗрд╡: {
рдкреНрд▓рдЧрдЗрдиреНрд╕: [
["рд░реВрдкрд╛рдВрддрд░рдг-рдкрд░рд┐рднрд╛рд╖рд┐рдд", рд╡рд╛рддрд╛рд╡рд░рдг],
["рдореЙрдбреНрдпреВрд▓-рд░рд┐рдЬрд╝реЙрд▓реНрд╡рд░", {рд░реВрдЯ: [./"] }],
"рд░реВрдкрд╛рдВрддрд░рдг-рд╕рдЬреНрдЬрд╛рдХрд╛рд░-рд╡рд┐рд░рд╛рд╕рдд",
"рд░реВрдкрд╛рдВрддрд░рдг-рд╡рд░реНрдЧ-рдЧреБрдг"
]
},
рдирд┐рд░реНрдорд╛рдг: {
рдкреНрд▓рдЧрдЗрдиреНрд╕: [
["рд░реВрдкрд╛рдВрддрд░рдг-рдкрд░рд┐рднрд╛рд╖рд┐рдд", рд╡рд╛рддрд╛рд╡рд░рдг],
["рдореЙрдбреНрдпреВрд▓-рд░рд┐рдЬрд╝реЙрд▓реНрд╡рд░", {рд░реВрдЯ: [./"] }],
"рд░реВрдкрд╛рдВрддрд░рдг-рд╕рдЬреНрдЬрд╛рдХрд╛рд░-рд╡рд┐рд░рд╛рд╕рдд",
"рд░реВрдкрд╛рдВрддрд░рдг-рд╡рд░реНрдЧ-рдЧреБрдг"
]
},
рдЙрддреНрдкрд╛рджрди: {
рдкреНрд░реАрд╕реЗрдЯ: [
[
"рдЫреЛрдЯрд╛ рдХрд░реЗрдВ", // рдпрд╣рд╛рдВ рдЫреЛрдЯрд╛ рдХреНрдпреЛрдВ рдЬреЛрдбрд╝реЗрдВ, рд╣рдо рдкреВрд░реЗ рдХреЛрдб рдмрдВрдбрд▓реЛрдВ рдкрд░ uglify рдЪрд▓рд╛рддреЗ рд╣реИрдВ
{
рдордВрдЧрд▓рд╛: рдЭреВрдард╛,
рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░реЗрдВ: рдЭреВрдард╛
}
]
],
рдкреНрд▓рдЧрдЗрдиреНрд╕: [
["рд░реВрдкрд╛рдВрддрд░рдг-рдкрд░рд┐рднрд╛рд╖рд┐рдд", рд╡рд╛рддрд╛рд╡рд░рдг],
["@babel/plugin-proposal-decorators", {рд╡рд┐рд░рд╛рд╕рдд: рд╕рдЪ }],
["@babel/plugin-proposal-class-properties", { рдвреАрд▓рд╛: рд╕рдЪ }],
["рдореЙрдбреНрдпреВрд▓-рд░рд┐рдЬрд╝реЙрд▓реНрд╡рд░", {рд░реВрдЯ: [./"] }]
],
рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ: рдЭреВрдареА,
рдХреЙрдореНрдкреИрдХреНрдЯ: рд╕рдЪ,
рдЫреЛрдЯрд╛ рдХрд┐рдпрд╛ рд╣реБрдЖ: рд╕рдЪ
}
}
};
````
рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЖрдк рд▓реЛрдЧ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЬрдпрдХрд╛рд░ред