Jest: рдЬреЗрд╕реНрдЯ рдХреЛ рд░рд┐рдПрдХреНрдЯ рдРрдк рдХреЗ рд╕рд╛рде рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдЯреЛрдХрди рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛

рдХреЛ рдирд┐рд░реНрдорд┐рдд 31 рдЕрдЧре░ 2018  ┬╖  42рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: facebook/jest

рдкреНрдпрд╛рд░ рдЬреЗрд╕реНрдЯ? рдХреГрдкрдпрд╛ рд╣рдорд╛рд░реЗ рд╕рдореВрд╣ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ: ЁЯСЙ 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

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

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
```
рдХреЙрдиреНрд╕реНрдЯ рдПрдирд╡рд╛рдпрд░рдореЗрдВрдЯ = рдЖрд╡рд╢реНрдпрдХрддрд╛ ("./env-config.js");

рдореЙрдбреНрдпреВрд▓.рдПрдХреНрд╕рдкреЛрд░реНрдЯ = {
рдкреНрд░реАрд╕реЗрдЯ: [
[
"рдЕрдЧрд▓рд╛/рдмреЗрдмреЗрд▓",
{
"рдкреНрд░реАрд╕реЗрдЯ-рдПрдирд╡реА": {
рдмрд┐рд▓реНрдЯрдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ: "рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐"
}
}
]
],
рдкреНрд▓рдЧрдЗрдиреНрд╕: [
["рд╕реНрдЯрд╛рдЗрд▓-рдШрдЯрдХ", {рдПрд╕рдПрд╕рдЖрд░: рд╕рдЪ, рдкреНрд░рджрд░реНрд╢рди рдирд╛рдо: рд╕рдЪ, рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕: рдЭреВрдард╛}],
[
"рдореЙрдбреНрдпреВрд▓-рд░рд┐рдЬрд╝реЙрд▓реНрд╡рд░",
{
рдЬрдбрд╝: ["ред/"]
}
]
],
рдкрд░реНрдпрд╛рд╡рд░рдг: {
рджреЗрд╡: {
рдкреНрд▓рдЧрдЗрдиреНрд╕: [
["рд░реВрдкрд╛рдВрддрд░рдг-рдкрд░рд┐рднрд╛рд╖рд┐рдд", рд╡рд╛рддрд╛рд╡рд░рдг],
["рдореЙрдбреНрдпреВрд▓-рд░рд┐рдЬрд╝реЙрд▓реНрд╡рд░", {рд░реВрдЯ: [./"] }],
"рд░реВрдкрд╛рдВрддрд░рдг-рд╕рдЬреНрдЬрд╛рдХрд╛рд░-рд╡рд┐рд░рд╛рд╕рдд",
"рд░реВрдкрд╛рдВрддрд░рдг-рд╡рд░реНрдЧ-рдЧреБрдг"
]
},
рдирд┐рд░реНрдорд╛рдг: {
рдкреНрд▓рдЧрдЗрдиреНрд╕: [
["рд░реВрдкрд╛рдВрддрд░рдг-рдкрд░рд┐рднрд╛рд╖рд┐рдд", рд╡рд╛рддрд╛рд╡рд░рдг],
["рдореЙрдбреНрдпреВрд▓-рд░рд┐рдЬрд╝реЙрд▓реНрд╡рд░", {рд░реВрдЯ: [./"] }],
"рд░реВрдкрд╛рдВрддрд░рдг-рд╕рдЬреНрдЬрд╛рдХрд╛рд░-рд╡рд┐рд░рд╛рд╕рдд",
"рд░реВрдкрд╛рдВрддрд░рдг-рд╡рд░реНрдЧ-рдЧреБрдг"
]
},
рдЙрддреНрдкрд╛рджрди: {
рдкреНрд░реАрд╕реЗрдЯ: [
[
"рдЫреЛрдЯрд╛ рдХрд░реЗрдВ", // рдпрд╣рд╛рдВ рдЫреЛрдЯрд╛ рдХреНрдпреЛрдВ рдЬреЛрдбрд╝реЗрдВ, рд╣рдо рдкреВрд░реЗ рдХреЛрдб рдмрдВрдбрд▓реЛрдВ рдкрд░ uglify рдЪрд▓рд╛рддреЗ рд╣реИрдВ
{
рдордВрдЧрд▓рд╛: рдЭреВрдард╛,
рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░реЗрдВ: рдЭреВрдард╛
}
]
],
рдкреНрд▓рдЧрдЗрдиреНрд╕: [
["рд░реВрдкрд╛рдВрддрд░рдг-рдкрд░рд┐рднрд╛рд╖рд┐рдд", рд╡рд╛рддрд╛рд╡рд░рдг],
["@babel/plugin-proposal-decorators", {рд╡рд┐рд░рд╛рд╕рдд: рд╕рдЪ }],
["@babel/plugin-proposal-class-properties", { рдвреАрд▓рд╛: рд╕рдЪ }],
["рдореЙрдбреНрдпреВрд▓-рд░рд┐рдЬрд╝реЙрд▓реНрд╡рд░", {рд░реВрдЯ: [./"] }]
],
рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ: рдЭреВрдареА,
рдХреЙрдореНрдкреИрдХреНрдЯ: рд╕рдЪ,
рдЫреЛрдЯрд╛ рдХрд┐рдпрд╛ рд╣реБрдЖ: рд╕рдЪ
}
}
};
````
рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЖрдк рд▓реЛрдЧ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЬрдпрдХрд╛рд░ред

рд╕рднреА 42 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдореБрдЭреЗ рднреА рдпрд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИред

рд╡рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИред

рдпрд╣рд╛рдБ рд╡рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИ .. рдереЛрдбрд╝рд╛ рдФрд░ рдЬрдЯрд┐рд▓ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдПрдХ рдореЛрдиреЛрд░реЗрдкреЛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдБред

@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 рд╕рдорд╛рдзрд╛рди рд╣реИрдВ:

рд╕рдорд╛рдзрд╛рди 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
```
рдХреЙрдиреНрд╕реНрдЯ рдПрдирд╡рд╛рдпрд░рдореЗрдВрдЯ = рдЖрд╡рд╢реНрдпрдХрддрд╛ ("./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 рд▓рд┐рдЦрдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЗрд╕реЗ рджреЗрдЦреЗрдВ

https://babeljs.io/docs/en/configuration

рд╣рд╛рдБ, 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 рд╕рд╛рде рдЕрдкрдиреА рдкрд╣рд▓реА рдкрд░реАрдХреНрд╖рдг рдлрд╝рд╛рдЗрд▓ рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрд╛рдж рджреЗрдЦреАред рдореВрд▓ рдореБрджреНрджреЗ рд╕реЗ рдмрд╣реБрдд рджреВрд░ рд▓реЗрдХрд┐рди рдореИрдВ рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рдорджрджрдЧрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

paularmstrong picture paularmstrong  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

nsand picture nsand  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

kentor picture kentor  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

emmby picture emmby  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

ticky picture ticky  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ