Jest: рдЬреЗрд╕реНрдЯ JSX рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдЬреЛ CSS рдЖрдпрд╛рдд рдХрд░рддрд╛ рд╣реИ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 7 рдорд╛рд░реНрдЪ 2017  ┬╖  24рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: facebook/jest

рдХреНрдпрд╛ рдЖрдк рдХрд┐рд╕реА рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдпрд╛ рдХрд┐рд╕реА рдмрдЧ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ?
рдХреАрдбрд╝рд╛

рд╡рд░реНрддрдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рдХреНрдпрд╛ рд╣реИ?
рдпрджрд┐ app.jsx рдореЗрдВ import './app.css'; рд╣реИ рддреЛ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ, рдореБрдЭреЗ рдпрд╣ рддреНрд░реБрдЯрд┐ рдорд┐рд▓реА:

yarn run:test v0.21.3
$ NODE_ENV=client jest -u
 FAIL  src/__tests__/app.test.js
  тЧП Test suite failed to run

    /home/svipben/Documents/react-boilerplate/src/client/app/app.css:1
    ({"Object.<anonymous>":function(module,exports,require,__dirname,__filename,global,jest){body {
                                                                                                  ^
    SyntaxError: Unexpected token {

      at transformAndBuildScript (node_modules/jest-runtime/build/transform.js:320:12)
      at Object.<anonymous> (src/client/app/app.jsx:7:1)
      at Object.<anonymous> (src/__tests__/app.test.js:2:12)

Test Suites: 1 failed, 1 total
Tests:       0 total
Snapshots:   0 total
Time:        0.693s
Ran all test suites.
error Command failed with exit code 1.

рдЕрдкреЗрдХреНрд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреНрдпрд╛ рд╣реИ?
рддреНрд░реБрдЯрд┐ рдХреЗ рдмрд┐рдирд╛ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП...

рдХреГрдкрдпрд╛ рдЕрдкрдирд╛ рд╕рдЯреАрдХ рдЬреЗрд╕реНрдЯ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкреНрд░рджрд╛рди рдХрд░реЗрдВ рдФрд░ рдЕрдкрдиреЗ рдЬреЗрд╕реНрдЯ, рдиреЛрдб, рдпрд╛рд░реНрди/рдПрдирдкреАрдПрдо рд╕рдВрд╕реНрдХрд░рдг рдФрд░ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░реЗрдВред

рдУрдПрд╕: рд▓рд┐рдирдХреНрд╕ рдЙрдмрдВрдЯреВ 16.04
рдЬреЗрд╕реНрдЯ: рдирд╡реАрдирддрдо
рдпрд╛рд░реНрди: рдирд╡реАрдирддрдо
рдиреЛрдб: рдирд╡реАрдирддрдо
babel-jest : рдирд╡реАрдирддрдо

.рдмреЗрдмреЗрд▓рдЖрд░рд╕реА:

        "client": {
            "presets": [
                "latest", // All you need to compile what's in ES2015+
                "flow", // Flow support
                "react", // Strip flow types and transform JSX
                "stage-2" // Experimental syntax extensions
            ],
            "sourceMaps": true // Compile with Source Maps
        },

рдордЬрд╝рд╛рдХ: NODE_ENV=рдХреНрд▓рд╛рдЗрдВрдЯ рдордЬрд╝рд╛рдХ -u

рдкреАрдПрд╕ рдЕрдЧрд░ рдореИрдВ import './app.css'; рдЯрд┐рдкреНрдкрдгреА/рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реВрдВ рддреЛ рд╕рдм рдХреБрдЫ рдареАрдХ рдЪрд▓рддрд╛ рд╣реИ

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

рдореИрдВрдиреЗ рдкреИрдХреЗрдЬ рдореЗрдВ рдЬреЗрд╕реНрдЯ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ moduleNameMapper рдХреБрдВрдЬреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛редjson рдлрд╝рд╛рдЗрд▓

{
   "jest":{
        "moduleNameMapper":{
             "\\.(css|less|sass|scss)$": "<rootDir>/__mocks__/styleMock.js",
             "\\.(gif|ttf|eot|svg)$": "<rootDir>/__mocks__/fileMock.js"
        }
   }
}

рдЗрд╕рдХреЗ рдмрд╛рдж рдЖрдкрдХреЛ рдиреАрдЪреЗ рдмрддрд╛рдП рдЕрдиреБрд╕рд╛рд░ рджреЛ рдлрд╛рдЗрд▓реЗрдВ рдмрдирд╛рдиреА рд╣реЛрдВрдЧреА

  • __mocks__/styleMock.js
module.exports = {};
  • __mocks__/fileMock.js
module.exports = 'test-file-stub';

рдпрджрд┐ рдЖрдк CSS рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рддреЛ рдХреНрд▓рд╛рд╕рдирд╛рдо рд▓реБрдХрдЕрдк рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЙрдХреНрд╕реА рдХрд╛ рдордЬрд╛рдХ рдЙрдбрд╝рд╛рдирд╛ рдмреЗрд╣рддрд░ рд╣реИред
рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдмрджрд▓ рдЬрд╛рдПрдЧреА:

{
  "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|less|scss|sass)$": "identity-obj-proxy"
    },
  }
}

рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ identity-obj-proxy рдкреИрдХреЗрдЬ рдХреЛ рджреЗрд╡ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА

yarn add identity-obj-proxy -D

рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдПред рдЖрдк рдЬреЗрд╕реНрдЯ рдбреЙрдХреНрд╕ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

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

@maximderbin рдзрдиреНрдпрд╡рд╛рдж!

@maximderbin рдзрдиреНрдпрд╡рд╛рдж! рдпрд╣ moduleNameMapper . рдЬреЛрдбрд╝рдХрд░ рдореЗрд░реА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░рддрд╛ рд╣реИ

@svipben @maximderbin @simonxl рдореБрдЭреЗ рдпрд╣ рдореЙрдбреНрдпреВрд▓рдирд╛рдордореИрдкрд░ рдХрд╣рд╛рдВ рдЬреЛрдбрд╝рдирд╛ рд╣реИ?
рдореИрдВ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рджреЗрдЦрддрд╛ рд╣реВрдВ рдХрд┐ рд╣рдо рдЗрд╕реЗ packag.json рдореЗрдВ рдЬреЛрдбрд╝реЗрдВрдЧреЗ рд▓реЗрдХрд┐рди рдХреМрди рд╕рд╛?
рдЯреАрдПрдирдПрдХреНрд╕

@sarahmarciano moduleNameMapper рдЖрдкрдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХрд╛ рдПрдХ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдЖрдк "jest" рдХреБрдВрдЬреА рдХреЗ рддрд╣рдд package.json (рдЬреЛ рдирд┐рд░реНрднрд░рддрд╛ рдореЗрдВ рдЬреЗрд╕реНрдЯ рдХреА рд╕реБрд╡рд┐рдзрд╛ рджреЗрддрд╛ рд╣реИ) рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ:

{
  "dependencies": {...}
  "jest": {
    "moduleNameMapper": {...}
  }
}

рдореИрдВрдиреЗ рдкреИрдХреЗрдЬ рдореЗрдВ рдЬреЗрд╕реНрдЯ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ moduleNameMapper рдХреБрдВрдЬреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛редjson рдлрд╝рд╛рдЗрд▓

{
   "jest":{
        "moduleNameMapper":{
             "\\.(css|less|sass|scss)$": "<rootDir>/__mocks__/styleMock.js",
             "\\.(gif|ttf|eot|svg)$": "<rootDir>/__mocks__/fileMock.js"
        }
   }
}

рдЗрд╕рдХреЗ рдмрд╛рдж рдЖрдкрдХреЛ рдиреАрдЪреЗ рдмрддрд╛рдП рдЕрдиреБрд╕рд╛рд░ рджреЛ рдлрд╛рдЗрд▓реЗрдВ рдмрдирд╛рдиреА рд╣реЛрдВрдЧреА

  • __mocks__/styleMock.js
module.exports = {};
  • __mocks__/fileMock.js
module.exports = 'test-file-stub';

рдпрджрд┐ рдЖрдк CSS рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рддреЛ рдХреНрд▓рд╛рд╕рдирд╛рдо рд▓реБрдХрдЕрдк рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЙрдХреНрд╕реА рдХрд╛ рдордЬрд╛рдХ рдЙрдбрд╝рд╛рдирд╛ рдмреЗрд╣рддрд░ рд╣реИред
рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдмрджрд▓ рдЬрд╛рдПрдЧреА:

{
  "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|less|scss|sass)$": "identity-obj-proxy"
    },
  }
}

рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ identity-obj-proxy рдкреИрдХреЗрдЬ рдХреЛ рджреЗрд╡ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА

yarn add identity-obj-proxy -D

рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдПред рдЖрдк рдЬреЗрд╕реНрдЯ рдбреЙрдХреНрд╕ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрджрд┐ рдЖрдкрдХреЗ рд╕реАрдПрд╕рдПрд╕ рдореЙрдбреНрдпреВрд▓ рдЙрди рдореВрд▓реНрдпреЛрдВ рдХреЛ рдирд┐рд░реНрдпрд╛рдд рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рди рдкрд░ рдЖрдкрдХреА рдЬреЗрдПрд╕рдПрдХреНрд╕ рдлрд╛рдЗрд▓реЗрдВ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИрдВ рддреЛ рдпрд╣рд╛рдВ рдЕрдиреБрд╢рдВрд╕рд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред рдЕрдзрд┐рдХрд╛рдВрд╢ рдорд╛рд░реНрдЧрджрд░реНрд╢рд┐рдХрд╛рдПрдБ рдорд╛рдирддреА рд╣реИрдВ рдХрд┐ рдЖрдк рд╡рд░реНрдЧ рдирд╛рдореЛрдВ рдХреЛ рдирд┐рд░реНрдпрд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ CSS рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдХрд╛рд╢ рд╕реАрдПрд╕рдПрд╕ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдареАрдХ рд╕реЗ рдордЬрд╛рдХ рдЙрдбрд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЧрд╛рдЗрдб рд╣реЛрддрд╛ред

@ рдореИрдереНрдпреВ-рдбреАрди рдЖрдкрдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ "рд╕реАрдПрд╕рдПрд╕ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдареАрдХ рд╕реЗ рдордЬрд╛рдХ рдХрд░рдирд╛"? рдХреНрдпрд╛ рдЖрдк рдЕрдкрдиреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХрд╛ рдереЛрдбрд╝рд╛ рдФрд░ рд╡рд░реНрдгрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдореБрдЭреЗ identity-obj-proxy рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдЕрдиреБрднрд╡ рд╣реИ

:export {
  sizeMobile: $size-mobile / 1px;
  sizePhablet: $size-phablet / 1px;
  sizeSmallTablet: $size-small-tablet / 1px;
  sizeTablet: $size-tablet / 1px;
  sizeDesktop: $size-desktop / 1px;
  sizeLargeDesktop: $size-large-desktop / 1px;
}
import styles from './variables.scss'

const tileSize = parseFloat(styles.sizeTablet) / 3
//...
render() {
  return <Tile style={{width: tileSize}} />
}

рдпрд╣ рдПрдХ рдХрд╛рд▓реНрдкрдирд┐рдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ, рдмрд╕ рдпрд╣ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рдЖрдк рд╕реАрдПрд╕рдПрд╕ рдореЙрдбреНрдпреВрд▓ рдФрд░ рдЬреЗрдПрд╕ рдХреЗ рдмреАрдЪ рд╕реНрдерд┐рд░рд╛рдВрдХ (рдорд╛рди) рд╕рд╛рдЭрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рдХрд┐ рд╕рд╢рд░реНрдд рдкреНрд░рддрд┐рдкрд╛рджрди рдпрд╛ рдЧрддрд┐рд╢реАрд▓ рдкреНрд░реЙрдкреНрд╕ рдХреЛ рдореВрд▓реНрдпреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕реМрдВрдкрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд▓реЗрдХрд┐рди identity-obj-proxy рдХреЗ рд╕рд╛рде, рдЗрди рдорд╛рдиреЛрдВ рдХреЛ рдкреВрд░реНрдгрд╛рдВрдХ рдореЗрдВ рдирд╣реАрдВ рдбрд╛рд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреЗрд╡рд▓ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдорд╛рди рдореМрдЬреВрдж рд╣реИрдВред рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ JSX рдХреЛрдб рд╣реИ рдЬреЛ рдЖрдкрдХреЗ CSS рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╕реНрдерд┐рд░рд╛рдВрдХ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЖрдк CSS рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдареАрдХ рд╕реЗ рдордЬрд╛рдХ рдХрд┐рдП рдмрд┐рдирд╛ рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рд▓реМрдЯрд╛рдП рдЬрд╛рдиреЗ рдкрд░ рдЬрд┐рд╕рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдпреЛрдЧреНрдп рдкреВрд░реНрдгрд╛рдВрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рди рд╣реИрдВ)ред identity-obj-proxy рдХреЗрд╡рд▓ рдпрд╣ рдорд╛рдирддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рд╕реАрдПрд╕рдПрд╕ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕реНрдХреЛрдкреНрдб рд╕реАрдПрд╕рдПрд╕ рдХреНрд▓рд╛рд╕рдирд╛рдо рд╕реЗ рдЬреНрдпрд╛рджрд╛ рдХреБрдЫ рдирд╣реАрдВ рд╣реИ; рдпрд╣ рд╕реАрдПрд╕рдПрд╕ рдореЙрдбреНрдпреВрд▓ рдХреЗ рджреВрд╕рд░реЗ рдкрд╣рд▓реВ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдореВрд▓реНрдпреЛрдВ / рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЛ рдирд┐рд░реНрдпрд╛рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИ рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ рдЬреЗрдПрд╕ рд╕рдВрдЪрд╛рд▓рди рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

@ рд╕рд┐рдореЗрдирдмреА

рд╕рдВрдпреЛрдЧ рд╕реЗ, рдореИрдВ рдЗрд╕ рддрд░рд╣ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рд╕реАрдПрд╕рдПрд╕ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдирдХрд▓ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛:

const styles = require('styles/variables.scss')

jest.mock('styles/variables.scss', () => {
  return {
    sizePhablet: 500,
    sizeSmallTablet: 768,
    sizeTablet: 1024,
    sizeDesktop: 1440,
    sizeLargeDesktop: 1920
  }
})

рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рдФрд░ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИ рдЬреЛ рд╕реАрдПрд╕рдПрд╕ рдореЙрдбреНрдпреВрд▓ рдХреА рд╕рднреА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ рдФрд░, рдореЗрд░реА рддрд░рд╣, рдЕрдкрдиреЗ рдмрд╛рд▓реЛрдВ рдХреЛ рд╕рднреА рдбрд┐рдлрд╝реЙрд▓реНрдЯ "рдмрд╕ identity-obj-proxy " рд╕рд▓рд╛рд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

рдореИрдВрдиреЗ 'рдЬреЗрд╕реНрдЯ-рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдо-рд╕реАрдПрд╕рдПрд╕' рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд┐рдпрд╛ред
рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдЬреЗрд╕реНрдЯ рдХреЙрдиреНрдлрд┐рдЧ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВред

"transform": {
      "^.+\\.js$": "babel-jest",
      ".+\\.(css|styl|less|sass|scss)$": "jest-transform-css"
    }

рдЕрдм css рдлрд╛рдЗрд▓реЗрдВ рдареАрдХ рд╡реИрд╕реЗ рд╣реА рдЯреНрд░рд╛рдВрд╕рдкрд╛рдЗрд▓ рд╣реЛ рдЬрд╛рдПрдВрдЧреА рдЬреИрд╕реЗ JS рдлрд╛рдЗрд▓реЗрдВ рдХрд░рддреА рдереАрдВред

@ рдореИрдереНрдпреВ-рдбреАрди рдЖрдкрдиреЗ рд╕реАрдПрд╕рдПрд╕ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдирдХрд▓реА рдХрд╣рд╛рдВ рд▓рд┐рдЦрд╛ рдерд╛ рдФрд░ рдЖрдк рдЗрд╕реЗ рдЬреЗрд╕реНрдЯ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдХреИрд╕реЗ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддреЗ рд╣реИрдВ?

рдореИрдВ рдПрдХ рдмрд╛рд╣рд░реА рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдпрд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреА рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рдПрдХ рдлрд╛рдЗрд▓ рдореЗрдВ рдЖрдпрд╛рдд рдХрд░рддрд╛ рд╣реИ:
<strong i="6">@import</strong> "progress-tracker/progress-tracker-variables.scss";

рдЬрдм рднреА рдореИрдВ рдкрд░реАрдХреНрд╖рдг рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЗрд╕реНрдЯ рдЪрд▓рд╛рддрд╛ рд╣реВрдВ
image
рдЙрдкрд░реЛрдХреНрдд рддреНрд░реБрдЯрд┐ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИред рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдкреИрдХреЗрдЬ рдХреЗ рдЕрдВрджрд░ css рдореЙрдХрдЕрдк рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рджрд┐рдпрд╛ рд╣реИредjson
image

рдореИрдВ рдЙрд╕ рдореБрджреНрджреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдорджрдж рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрддреНрд╕реБрдХ рд╣реВрдВред рдХреЛрдИ рддрд░рдХреАрдм, рд╕реБрдЭрд╛рд╡?

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдореИрдВрдиреЗ рдмреИрдмреЗрд▓-рдЬреЗрд╕реНрдЯ рдФрд░ рдЖрдЗрдбреЗрдВрдЯрд┐рдЯреА-рдУрдмреАрдЬреЗ-рдкреНрд░реЙрдХреНрд╕реА рдкреИрдХреЗрдЬ рджреЛрдиреЛрдВ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИ рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдиреЗ рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред рд╕рдорд╕реНрдпрд╛ рдЕрднреА рднреА рдмрдиреА рд╣реБрдИ рд╣реИред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ 2: рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдореИрдВрдиреЗ рд╡реЗрдм рдкрд░ рдЖрдП рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИред
image

рдореИрдВ рдмреИрдмреЗрд▓ 7 , рдмреЗрдмреЗрд▓-рдЬреЗрд╕реНрдЯ ^24.5.0 , рдЬреЗрд╕реНрдЯ ^24.1.0 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

рдЙрдкрд░реЛрдХреНрдд рд╕рд▓рд╛рд╣ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рднреА, рдореБрдЭреЗ рдпрд╣ рддреНрд░реБрдЯрд┐ рддрдм рднреА рдорд┐рд▓ рд░рд╣реА рд╣реИ рдЬрдм рдореИрдВ рд▓рдХреНрд╖реНрдп рдлрд╝рд╛рдЗрд▓ (рдЬреИрд╕реЗ $#$5) рдХреЛ рдЬреЗрд╕реНрдЯ рдкрд░реАрдХреНрд╖рдг рдлрд╝рд╛рдЗрд▓ (рдЬреИрд╕реЗ Post.test.js ) рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдпрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд░рдиреЗ import рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реВрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП Post.js ) рдПрдХ CSS рдлрд╝рд╛рдЗрд▓ рдЖрдпрд╛рдд рдХрд░рддрд╛ рд╣реИ - рдЬреИрд╕реЗ ./postStyles.css ред

Jest encountered an unexpected token

SyntaxError: Unexpected token .

Details:

    /Users/ben/Desktop/Work/code/bengrunfeld/src/front-end/components/Post/postStyles.css:1
    ({"Object.<anonymous>":function(module,exports,require,__dirname,__filename,global,jest){.post h1, .post h2, .post h3 {

      3 |
      4 | import { PostText } from './styles'
    > 5 | import './postStyles.css'

рдКрдкрд░ рджрд┐рдП рдЧрдП рд▓реЗрдЦ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдпрд╣ рдореЗрд░реЗ package.json рдореЗрдВ рд╣реИ:

"jest": {
    "moduleFileExtensions": ["js", "jsx"],
    "moduleDirectories": ["node_modules", "bower_components", "shared"],

    "moduleNameMapper": {
      "\\.(css|less)$": "<rootDir>/__mocks__/styleMock.js",
      "\\.(gif|ttf|eot|svg)$": "<rootDir>/__mocks__/fileMock.js",

      "^react(.*)$": "<rootDir>/vendor/react-master$1",
      "^config$": "<rootDir>/configs/app-config.js"
    }
  },

рдФрд░ рдореВрд▓ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ, рдореЗрд░реЗ рдкрд╛рд╕ __mocks__/styleMock.js рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдирд┐рдореНрди рдХреЛрдб рд╣реИ:

module.exports = {};

рдЕрдВрдд рдореЗрдВ, рдореЗрд░рд╛ jest.config.js :

module.exports = {
  setupFiles: ['<rootDir>/src/test/setup.js']
}

рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ рдПрдВрдЬрд╛рдЗрдо рдХреЛ рд╡рд┐рдиреНрдпрд╕реНрдд рдХрд░рддрд╛ рд╣реИ:

import Enzyme from 'enzyme'
import Adapter from 'enzyme-adapter-react-16'

Enzyme.configure({ adapter: new Adapter() })

import Error
рдореИрдВ рд▓рдЧрднрдЧ рдЙрд╕реА рдореБрджреНрджреЗ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдШрд░реНрд╖ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬрд╣рд╛рдВ рдореЗрд░реА рдПрд╕рд╕реАрдПрд╕рдПрд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ @import рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рд╣реИрдВред рд╕рд┐рдВрдЯреИрдХреНрд╕ рддреНрд░реБрдЯрд┐ рдмрддрд╛рдиреЗ рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдлрд▓: рдЕрдорд╛рдиреНрдп рдпрд╛ рдЕрдирдкреЗрдХреНрд╖рд┐рдд рдЯреЛрдХрдиред рдХреГрдкрдпрд╛ рдХреНрдпрд╛ рдХреЛрдИ рдореЗрд░реА рд╕рд╣рд╛рдпрддрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ?

рдореИрдВрдиреЗ рдКрдкрд░ рджрд┐рдП рдЧрдП рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд┐рдпрд╛ рд▓реЗрдХрд┐рди рдЙрдирдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ

рдореИрдВ рдПрдХ рджреЗрд╡ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ @babel/polyfill рдЬреЛрдбрд╝рдХрд░ рдЗрд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛

рд╡рд╣реА рдпрд╣рд╛рдБ @ fthomas82

рдореИрдВрдиреЗ рдкреИрдХреЗрдЬ рдореЗрдВ рдЬреЗрд╕реНрдЯ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ moduleNameMapper рдХреБрдВрдЬреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛редjson рдлрд╝рд╛рдЗрд▓

{
   "jest":{
        "moduleNameMapper":{
             "\\.(css|less|sass|scss)$": "<rootDir>/__mocks__/styleMock.js",
             "\\.(gif|ttf|eot|svg)$": "<rootDir>/__mocks__/fileMock.js"
        }
   }
}

рдЗрд╕рдХреЗ рдмрд╛рдж рдЖрдкрдХреЛ рдиреАрдЪреЗ рдмрддрд╛рдП рдЕрдиреБрд╕рд╛рд░ рджреЛ рдлрд╛рдЗрд▓реЗрдВ рдмрдирд╛рдиреА рд╣реЛрдВрдЧреА

  • __mocks__/styleMock.js
module.exports = {};
  • __mocks__/fileMock.js
module.exports = 'test-file-stub';

рдпрджрд┐ рдЖрдк CSS рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рддреЛ рдХреНрд▓рд╛рд╕рдирд╛рдо рд▓реБрдХрдЕрдк рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЙрдХреНрд╕реА рдХрд╛ рдордЬрд╛рдХ рдЙрдбрд╝рд╛рдирд╛ рдмреЗрд╣рддрд░ рд╣реИред
рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдмрджрд▓ рдЬрд╛рдПрдЧреА:

{
  "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|less|scss|sass)$": "identity-obj-proxy"
    },
  }
}

рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ identity-obj-proxy рдкреИрдХреЗрдЬ рдХреЛ рджреЗрд╡ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА

yarn add identity-obj-proxy -D

рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдПред рдЖрдк рдЬреЗрд╕реНрдЯ рдбреЙрдХреНрд╕ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

рдЗрд╕рдиреЗ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд┐рдпрд╛ред рдзрдиреНрдпрд╡рд╛рдж!!!

рдореИрдВрдиреЗ 'рдЬреЗрд╕реНрдЯ-рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдо-рд╕реАрдПрд╕рдПрд╕' рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд┐рдпрд╛ред
рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдЬреЗрд╕реНрдЯ рдХреЙрдиреНрдлрд┐рдЧ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВред

"transform": {
      "^.+\\.js$": "babel-jest",
      ".+\\.(css|styl|less|sass|scss)$": "jest-transform-css"
    }

рдЕрдм css рдлрд╛рдЗрд▓реЗрдВ рдареАрдХ рд╡реИрд╕реЗ рд╣реА рдЯреНрд░рд╛рдВрд╕рдкрд╛рдЗрд▓ рд╣реЛ рдЬрд╛рдПрдВрдЧреА рдЬреИрд╕реЗ JS рдлрд╛рдЗрд▓реЗрдВ рдХрд░рддреА рдереАрдВред

рдзрдиреНрдпрд╡рд╛рдж, рднрд╛рдИ @krajasekhar
рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ

рдореИрдВрдиреЗ рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╕рдлрд▓рддрд╛ рдХреЗ packages.json рдореЗрдВ рд╕реБрдЭрд╛рдП рдЧрдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдЬреЛрдбрд╝рд╛, рддрдм рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рдореЗрд░реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд░реВрдЯ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ jest.config.js рдерд╛, рдЬреЗрд╕реНрдЯ рдЙрд╕ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ packages.json рд╕реЗ рдЕрдзрд┐рдХ рдХрд░рддрд╛ рд╣реИред

рдпрд╣рд╛рдБ рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП рдореЗрд░реА jest.config.js рдлрд╝рд╛рдЗрд▓ рд╣реИ:

module.exports = {
  setupFilesAfterEnv: ['<rootDir>/.setup-tests.js'],
  testPathIgnorePatterns: ['<rootDir>/.next/', '<rootDir>/node_modules/'],
  transform: {
    '^.+\\.js$': 'babel-jest',
    '.+\\.(css|styl|less|sass|scss)$': 'jest-transform-css',
  },
};

рдореБрдЭреЗ рдЕрдкрдиреЗ рдХреЛрдб рдореЗрдВ рдПрдХ рдХрдЪреНрдЪрд╛ рд╕реАрдПрд╕рдПрд╕ рдЖрдпрд╛рдд рдХрд░рдирд╛ рд╣реИ

import "./cloud.css?raw"

рдореИрдВрдиреЗ рдЬреЗрд╕реНрдЯ рдХреЙрдиреНрдлрд┐рдЧ рдХреЛ рднреА рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рд╣реИ
"jest":{ "moduleNameMapper": { "\\.(css|less|scss|sass|css?raw)$": "identity-obj-proxy" },

рдлрд┐рд░ рднреА, рдореБрдЭреЗ рдЖрдпрд╛рдд рд▓рд╛рдЗрди рдкрд░ рдкрд░реАрдХреНрд╖рдг рддреНрд░реБрдЯрд┐ рдорд┐рд▓ рд░рд╣реА рд╣реИред рдХрдЪреНрдЪреЗ рдЖрдпрд╛рдд рдХрд╛ рдордЬрд╛рдХ рдЙрдбрд╝рд╛рдиреЗ рдХрд╛ рдХреЛрдИ рд╡рд┐рдЪрд╛рд░?

@import рдЕрдирдкреЗрдХреНрд╖рд┐рдд рдЯреЛрдХрди рдХрд╛ рд╕рдорд╛рдзрд╛рди = :)

рдкреИрдХреЗрдЬ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗ:
npm i --save-dev identity-obj-proxy

Jest.config.js . рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ

module.exports = {
  "moduleNameMapper": {
    "\\.(css|less|scss)$": "identity-obj-proxy"
  }
}

рдЕрдЧрд░ рдХреЛрдИ рдпрд╣рд╛рдБ рдЖрддрд╛ рд╣реИ:
рдпрд╣ рдореЙрдбреНрдпреВрд▓ рд╕рдмрд╕реЗ рдЕрджреНрдпрддрди рдореИрдВрдиреЗ рджреЗрдЦрд╛ рд╣реИ: https://www.npmjs.com/package/jest-css-modules-transform

transform: { '^.+\\.(js|jsx|ts|tsx)$': '<rootDir>/node_modules/babel-jest', ".+\\.(css|styl|less|sass|scss)$": "jest-css-modules-transform" }, transformIgnorePatterns: [ '/node_modules/', '^.+\\.module\\.(css|sass|scss)$', ], moduleNameMapper: { '^.+\\.module\\.(css|sass|scss)$': 'identity-obj-proxy' },

рдореИрдВрдиреЗ рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╕рдлрд▓рддрд╛ рдХреЗ packages.json рдореЗрдВ рд╕реБрдЭрд╛рдП рдЧрдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдЬреЛрдбрд╝рд╛, рддрдм рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рдореЗрд░реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд░реВрдЯ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ jest.config.js рдерд╛, рдЬреЗрд╕реНрдЯ рдЙрд╕ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ packages.json рд╕реЗ рдЕрдзрд┐рдХ рдХрд░рддрд╛ рд╣реИред

рдпрд╣рд╛рдБ рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП рдореЗрд░реА jest.config.js рдлрд╝рд╛рдЗрд▓ рд╣реИ:

module.exports = {
  setupFilesAfterEnv: ['<rootDir>/.setup-tests.js'],
  testPathIgnorePatterns: ['<rootDir>/.next/', '<rootDir>/node_modules/'],
  transform: {
    '^.+\\.js$': 'babel-jest',
    '.+\\.(css|styl|less|sass|scss)$': 'jest-transform-css',
  },
};

рд╕рдорд╛рдзрд╛рди рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рд▓реЛрдЧреЛрдВ рдХреЛ рдзрдиреНрдпрд╡рд╛рдж рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЖрдкрдХреЛ @Shadoow! рдпрд╣ рдПрдХ рддрд░рд╣ рдХреА рддрд╛рд░реНрдХрд┐рдХ рдмрд╛рдд рдереА рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрд╛рдж рдЖ рд░рд╣рд╛ рдерд╛ рдХрд┐ ... рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ package.json . рдореЗрдВ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛

рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдирдП рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП, рдЬреЛ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рд░рдЧрд░ рд░рд╣рд╛, рд╡рд╣ рд╣рдорд╛рд░реА рд╕рд╛рдореБрджрд╛рдпрд┐рдХ рдбреНрд░реАрдо рдЯреАрдо рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдП рдЧрдП рдХрдИ рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХрд╛ рдПрдХ рд╕рдВрдШ рдерд╛:

1) рдПрдХ jest.config.json рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБ

touch jest.config.json open jest.config.json

2) рдЬреЗрд╕реНрдЯ-рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдо-рд╕реАрдПрд╕рдПрд╕ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ:

yarn add jest-transform-css -D

3) рдЖрдкрдХреА рдЬреЗрд╕реНрдЯ рдХреЙрдиреНрдлрд┐рдЧ рдлрд╛рдЗрд▓ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрдиреА рдЪрд╛рд╣рд┐рдП:

module.exports = {
  preset: 'ts-jest/presets/js-with-babel',
  moduleNameMapper: {
    '\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2)$': './jest.mock.js',
  },
  setupFilesAfterEnv: ['<rootDir>/jest.setup.js'],
  testPathIgnorePatterns: ['<rootDir>/node_modules/', '<rootDir>/assets/'],
  transform: {
    '^.+\\.jsx?$': 'babel-jest',
    '\\.(css|less|scss|sass)$': 'jest-transform-css',
  },
};

4) рдЕрдкрдиреЗ package.json рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ (рдкрд╣рд▓реЗ, рдЕрдкрдиреЗ рд╕рднреА рдЬреЗрд╕реНрдЯ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВ, рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреБрдЫ рд╣реИ, рддреЛ рдирдИ рдЬреЗрд╕реНрдЯ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдореЗрдВ), рддреЛ рдЬрд╛рджреВ рдпрд╣рд╛рдБ рдЬрд╛рддрд╛ рд╣реИ:

"test": "jest --config ./jest.config.js"

рд╣рд░ рдХреЛрдИ!

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

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

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

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

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

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

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