Jest: "рд╕рд┐рдВрдЯреИрдХреНрд╕ рддреНрд░реБрдЯрд┐: рдЕрдорд╛рдиреНрдп рдпрд╛ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдЯреЛрдХрди" .png . рдХреЗ рд╕рд╛рде

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

рдореИрдВ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрд╣ рддреНрд░реБрдЯрд┐ рдорд┐рд▓ рд░рд╣реА рд╣реИ:

Test suite failed to run

    /home/matheusml/Projects/react-completo/src/assets/images/dribble-logo.png:1
    ({"Object.<anonymous>":function(module,exports,require,__dirname,__filename,global,jest){я┐╜PNG
                                                                                             ^
    SyntaxError: Invalid or unexpected token

      at transformAndBuildScript (node_modules/jest-runtime/build/transform.js:320:12)
      at Object.<anonymous> (src/components/container/Container.js:4:46)
      at Object.<anonymous> (src/components/App.js:4:44)

рдпрд╣ рдкрд░реАрдХреНрд╖рдг рд╣реИ:

import React from 'react';
import renderer from 'react-test-renderer';
import { Router } from 'react-router';

import App from './App';

test('App', () => {
  const component = renderer.create(
    <App />
  );
  let tree = component.toJSON();
  expect(tree).toMatchSnapshot();
});

рдпрд╣ рдореЗрд░рд╛ рдкреИрдХреЗрдЬ рд╣реИредрдЬреЗрд╕рди:

"jest": {
    "moduleNameMapper": {
      "\\.(jpg|jpeg|png|svg)$": "./src/config/fileMock.js",
      "\\.(css|scss)$": "identity-obj-proxy"
    }
  }

рдФрд░ рдпрд╣ рд╣реИ fileMock.js:

module.exports = 'test-file-stub';

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

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

рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╣реА рддреНрд░реБрдЯрд┐ рдереА рдФрд░ рдЗрд╕реЗ рд╕рдВрдкрддреНрддрд┐ рдЯреНрд░рд╛рдиреНрд╕рдлрд╝реЙрд░реНрдорд░.рдЬреЗрдПрд╕ рдмрдирд╛рдХрд░ рд╣рд▓ рдХрд┐рдпрд╛:

const path = require('path');

module.exports = {
  process(src, filename, config, options) {
    return 'module.exports = ' + JSON.stringify(path.basename(filename)) + ';';
  },
};

рдлрд┐рд░ рдЗрд╕реЗ package.json рдореЗрдВ рдЕрдкрдиреЗ рдЬреЗрд╕реНрдЯ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ:
"jest": { "moduleNameMapper": { "\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$": "<rootDir>/assetsTransformer.js", "\\.(css|less)$": "<rootDir>/assetsTransformer.js" } },

рд╕реНрд░реЛрдд: https://facebook.github.io/jest/docs/webpack.html#content

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

http://facebook.github.io/jest/docs/tutorial-webpack.html#content . рджреЗрдЦреЗрдВ

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдирдпрд╛ рд▓рд┐рдВрдХ рд╣реИ https://jestjs.io/docs/en/webpack

@matheusml рдХреНрдпрд╛ рдЖрдкрдиреЗ рдЗрд╕реЗ рдмрд┐рд▓реНрдХреБрд▓ рд╣рд▓ рдХрд┐рдпрд╛? @cpojer рдореИрдВ рдкреБрд╖реНрдЯрд┐ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдореБрдЭреЗ рднреА рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдЖ рд░рд╣реА рд╣реИред рдореЗрд░реЗ рдкрд╛рд╕ рдореЗрд░реЗ рд╕реНрд░реЛрдд рдХреЗ рдмрд╛рд╣рд░ рд╕реНрдерд┐рд░ рд╕рдВрдкрддреНрддрд┐рдпрд╛рдВ рд╣реИрдВред рдпрд╛рдиреА рдореЗрд░реА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕рдВрд░рдЪрдирд╛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреА рд╣реИ:

|-fonts
|-img
\_styles
src
|-components
|-pages
...

рдореЗрд░рд╛ рдордЬрд╝рд╛рдХ config рд▓рд┐рдВрдХ рдореЗрдВ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рдорд╛рди рджрд┐рдЦрддрд╛ рд╣реИ:

"jest": {
    "collectCoverageFrom": [ "src/**/*.{js,jsx}" ],
    "moduleNameMapper": {
      "\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$": "tests/__mocks__/fileMock.js"
    }
  }

рдЬрдм рдпрд╣ рдЫрд╡рд┐ рдЖрдпрд╛рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИ рддреЛ рдореЗрд░рд╛ рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ:

import thumbnail from 'img/thumbnail.png'

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдиреЛрдЯ рдХрд░рдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдпрджрд┐ рдореИрдВ public рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЛ moduleDirectories рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рдХрд░рддрд╛, рддреЛ рдореБрдЭреЗ рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИ: Cannot find module 'img/thumbnail.png' from 'MyModule.js'

рдХреНрдпрд╛ рдпрд╣ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╣реИ? рдХреНрдпрд╛ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдЖрдпрд╛рдд рдШрдЯрдирд╛ рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЛ рдорд╛рдиреНрдп рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореЙрдбреНрдпреВрд▓ рдореИрдкрд┐рдВрдЧ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реЗрдЯрдЕрдк рд╣реИ? рдЕрдиреНрдпрдерд╛ рдореБрдЭреЗ рдКрдкрд░ рдХреА рддрд░рд╣ рд╣реА рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИред рдореИрдВрдиреЗ рдореИрдкрд░ рдирд╛рдо рдореЗрдВ рдХрд┐рд╕реА рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрдпрд╛рдд рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХреА рд╣реИред

рдореБрдЭреЗ рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝ рд░рд╣рд╛ рд╣реИ, рдореИрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдЬреЗ рд╕рд░реНрд╡рд░ рдкреНрд░рддрд┐рдкрд╛рджрди рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдлрд┐рдХреНрд╕ред

рдореИрдВрдиреЗ рдЗрд╕реЗ рдЕрдкрдиреЗ рдмреЗрдмреЗрд▓рд░ рдореЗрдВ рд░рдЦрд╛ рд╣реИ рдФрд░ рдЪреАрдЬреЗрдВ рдХрд╛рдо рдХрд░ рд░рд╣реА рд╣реИрдВ:

{
"рдкреНрд░реАрд╕реЗрдЯ": ["es2015", "рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛"]
}

рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐

SyntaxError: Unexpected token <
      /media/sibin/F_WORK/<path>/<icon-name>.svg:1
      ({"Object.<anonymous>":function(module,exports,require,__dirname,__filename,global,jest){<?xml version="1.0" encoding="UTF-8"?>
                                                                                               ^
      SyntaxError: Unexpected token <

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рднреА рдпрд╣ рд╕рдорд╕реНрдпрд╛ рд╣реЛ рд░рд╣реА рд╣реИред рдпрд╣ рддрдм рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдореБрдЭреЗ рдкреАрдПрдирдЬреА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

({"Object.<anonymous>":function(module,exports,require,__dirname,__filename,global,jest){я┐╜PNG
                                                                                             ^
    SyntaxError: Invalid or unexpected token

рд╡рд╣реА рддреНрд░реБрдЯрд┐ рднреАред рдХреНрдпрд╛ рдХреЛрдИ рдЗрд╕реЗ рдареАрдХ рдХрд░рддрд╛ рд╣реИ?

.mp3 рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рддреНрд░реБрдЯрд┐ рд╣реИ, рдХреБрдЫ рднреА рдорджрдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ

рдЗрд╕ рддрд░рд╣ рдХреА рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдореЙрдбреНрдпреВрд▓ рдирд╛рдо рдореИрдкрд░ рдореЗрдВ рд╕реЗрдЯ рдХрд┐рдП рдЧрдП рдкреВрд░реНрдг рдкрде рд╡рд╛рд▓реЗ рдкреНрд░реАрд╕реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рднреА рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдорд╛рдорд▓рд╛ рдЕрдЧрд▓реА рд░рд┐рд▓реАрдЬ рдореЗрдВ рддрдп рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛

рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╣реА рддреНрд░реБрдЯрд┐ рдереА рдФрд░ рдЗрд╕реЗ рд╕рдВрдкрддреНрддрд┐ рдЯреНрд░рд╛рдиреНрд╕рдлрд╝реЙрд░реНрдорд░.рдЬреЗрдПрд╕ рдмрдирд╛рдХрд░ рд╣рд▓ рдХрд┐рдпрд╛:

const path = require('path');

module.exports = {
  process(src, filename, config, options) {
    return 'module.exports = ' + JSON.stringify(path.basename(filename)) + ';';
  },
};

рдлрд┐рд░ рдЗрд╕реЗ package.json рдореЗрдВ рдЕрдкрдиреЗ рдЬреЗрд╕реНрдЯ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ:
"jest": { "moduleNameMapper": { "\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$": "<rootDir>/assetsTransformer.js", "\\.(css|less)$": "<rootDir>/assetsTransformer.js" } },

рд╕реНрд░реЛрдд: https://facebook.github.io/jest/docs/webpack.html#content

рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдерд╛ рдХрд┐ <rootDir> рдЬреЗрд╕реНрдЯ рджреНрд╡рд╛рд░рд╛ рдЖрдкреВрд░реНрддрд┐ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдПрдХ рдЯреЛрдХрди рд╣реИ, рдФрд░ рдпрд╣ рдорд╛рди рд▓рд┐рдпрд╛ рдХрд┐ рдпрд╣ рдХреБрдЫ рдРрд╕рд╛ рдерд╛ рдЬрд┐рд╕реЗ рдореБрдЭреЗ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред рдЗрд╕реЗ moduleNameMapper рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рд╣реЛ рдЧрдИред

рдореИрдВрдиреЗ @bombellos рджреНрд╡рд╛рд░рд╛ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд assetTransformer.js рдХреЛ рдЬреЛрдбрд╝рд╛ред рд╡реЗрдмрдкреИрдХ рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рднреА рдкрд╛рд▓рди рдХрд┐рдпрд╛ред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЕрднреА рднреА рд╡рд╣реА рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдорд┐рд▓рддреА рд╣реИрдВред

рдкреАрдПрдирдЬреА:

 FAIL  components/__tests__/List.js
  тЧП Test suite failed to run

    /assets/images/logo-header.png:1
    ({"Object.<anonymous>":function(module,exports,require,__dirname,__filename,global,jest){я┐╜PNG
                                                                                             ^

    SyntaxError: Invalid or unexpected token

      at ScriptTransformer._transformAndBuildScript (node_modules/jest-runtime/build/script_transformer.js:305:17)
      at Object.<anonymous> (components/PageHeader.js:15:19)
      at Object.<anonymous> (components/Main.js:10:436)

рдПрд╕рд╡реАрдЬреА:

 FAIL  ui/Button/__tests__/snapshot.test.js
  тЧП fixture 'TextAndIcon' snapshots are rendered correctly

    /assets/icons/fontawesome/regular.svg:1
    ({"Object.<anonymous>":function(module,exports,require,__dirname,__filename,global,jest){<svg xmlns="http://www.w3.org/2000/svg" style="display: none;">
                                                                                             ^

    SyntaxError: Unexpected token <

      at ScriptTransformer._transformAndBuildScript (node_modules/jest-runtime/build/script_transformer.js:305:17)
      at Icon (ui/Icon.js:31:17)
      at resolve (node_modules/react-dom/cjs/react-dom-server.node.development.js:2599:14)
      at ReactDOMServerRenderer.render (node_modules/react-dom/cjs/react-dom-server.node.development.js:2746:22)
      at ReactDOMServerRenderer.read (node_modules/react-dom/cjs/react-dom-server.node.development.js:2722:19)
      at Object.renderToStaticMarkup (node_modules/react-dom/cjs/react-dom-server.node.development.js:2991:25)

рдореЗрд░реА рдлрд╝реЛрд▓реНрдбрд░ рд╕рдВрд░рдЪрдирд╛ рдореВрд▓ рд░реВрдк рд╕реЗ рд╣реИ:

<rootDir>
  assets
    *.png, *.svg, ...
  components
    *.js
  ui
    *.js

рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЕрднреА рднреА рдордЬрд╛рдХ рдХрд┐рдП рдЬрд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп рд▓реЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдХреЛрдИ рд╕реБрд░рд╛рдЧ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдХреИрд╕реЗ рдбрд┐рдмрдЧ рдХрд░рдирд╛ рд╣реИред

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

{
  "presets": [
    ["es2015", {"modules": false}],
    "react",
    "stage-1",
    ["env", {
      "targets": {
        "browsers": [
          "last 3 versions",
          "> 1%",
          "Firefox ESR",
          "iOS 9"
        ]
      }
    }]

  ],
  "plugins": [
    "react-hot-loader/babel",
    "transform-class-properties",
    "transform-react-jsx-source",
    "glamorous-displayname",
    "wildcard"
  ],
  "env": {
    "development": {
      "plugins": [
        ["transform-runtime", {
          "polyfill": true
        }]
      ]
    },
    "test": {
      "plugins": ["transform-es2015-modules-commonjs"]
    }
  }
}

рдкреИрдХреЗрдЬ.рдЬреЗрд╕рди:

  "jest": {
    "snapshotSerializers": [
      "jest-glamor-react",
      "enzyme-to-json/serializer"
    ],
    "moduleFileExtensions": ["js"],
    "moduleDirectories": ["node_modules"],
    "transform": {
      "\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$": "<rootDir>/config/jest/assetsTransformer.js"
    }
  },

рдореИрдВ рдЧреВрдВрдЧрд╛ рд╣реВрдВ, рдореЗрд░реЗ рд░реВрдЯ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдФрд░ jest.config.js рдерд╛ рдЬрд┐рд╕рдиреЗ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд░ рджрд┐рдпрд╛ package.json ред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдЕрднреА рддрдХ рдирд╣реАрдВ рдЪрд▓ рд░рд╣рд╛ рд╣реИ, рдореБрдЭреЗ рдЕрдм рдпрд╣ рд╡рд┐рд╢реЗрд╖ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рдорд┐рд▓рддреА рд╣реИред

рдХрд╛рдо рдХрд░ рдЧрдпрд╛ред рдпрд╣рд╛рдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдЯреНрд╕ рд╣реИрдВ (рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ 16 рдХреЗ рд╕рд╛рде рдПрдВрдЬрд╛рдЗрдо 3 рдХреЗ рдХрд╛рд░рдг рдореЗрд░реЗ рдкрд╛рд╕ рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╣реИ):

.babelrc

{
  "presets": [
    "es2015",
    "react",
    "stage-1",
    "env"

  ],
  "plugins": [
    "react-hot-loader/babel",
    "transform-class-properties",
    "transform-react-jsx-source",
    "glamorous-displayname",
    "wildcard"
  ],
  "env": {
    "development": {
      "plugins": [
        ["transform-runtime", {
          "polyfill": true
        }]
      ]
    }
  }
}

jest.config.js

// this helps: https://github.com/facebook/jest/issues/2081#issuecomment-332406033
module.exports = {
  verbose: true,
  setupFiles: ['./jest.setup.js'],
  snapshotSerializers: ['jest-glamor-react', 'enzyme-to-json/serializer'],
  moduleFileExtensions: ['js', 'jsx'],
  transform: {
    '^.+\\.jsx?$': 'babel-jest',
    '\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$':
      '<rootDir>/config/jest/assetsTransformer.js',
  },
};

jest.setup.js

import 'raf/polyfill';
import Enzyme from 'enzyme';
import Adapter from 'enzyme-adapter-react-16';

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

рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рдХреА рдорджрдж рдХрд░рддрд╛ рд╣реИред

рдореБрдЭреЗ svg рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рдЖ рд░рд╣реА рдереАред рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рдореИрдВ рдЗрд╕рдХрд╛ рдордЬрд╛рдХ рдЙрдбрд╝рд╛ рд╕рдХрддрд╛ рд╣реВрдВ identity-obj-proxy :

    "moduleNameMapper": {
      "\\.(css|scss|svg)$": "identity-obj-proxy"
    },

рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рджреЗрдЦрдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП @timgivois рд░рд╛рд╕реНрддрд╛ рдореЗрд░реЗ рд▓рд┐рдП рдЦреВрдмрд╕реВрд░рддреА рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЖрд╡рд╢реНрдпрдХ рдирд┐рд░реНрднрд░рддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ npm install --save-dev identity-obj-proxy рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

  "jest": {
    "moduleNameMapper": {
      ".+\\.(css|styl|less|sass|scss|png|jpg|ttf|woff|woff2)$": "identity-obj-proxy"
    }
  }

рдЬрдмрдХрд┐ @mbaranovski рджреНрд╡рд╛рд░рд╛ рд╕рдорд╛рдзрд╛рди рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЙрд╕рдХрд╛ рдЗрд░рд╛рджрд╛ рдЗрд╕реЗ рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдорд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдерд╛ рдпрд╛ рдирд╣реАрдВред рдпрд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЖрдЙрдЯрдкреБрдЯ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ (src рд╡рд┐рд╢реЗрд╖рддрд╛ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ):

<img alt="ImgName" height="28" src={ Object { "process": [Function], } } width="112" />

рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ, рдпрд╣ рдЙрд╕ рдореЙрдбреНрдпреВрд▓ рд╕реЗ рд╕рдм рдХреБрдЫ рдореИрдк рдХрд░ рд░рд╣рд╛ рд╣реИ рдЬрд╣рд╛рдВ рдореБрдЭреЗ рдПрдХ рдПрд╕рд╡реАрдЬреА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЖрдк рдмрд╕ рдЙрд╕ рдореЙрдбреНрдпреВрд▓ рд╕реЗ рджреВрд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ:

module.exports = {}

рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЕрдиреНрдп рдХрд╛рдордХрд╛рдЬ рдкрд╣рдЪрд╛рди-рдУрдмреАрдЬреЗ-рдкреНрд░реЙрдХреНрд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред

@magnusart

"jest": {
    "moduleNameMapper": {
      ".+\\.(css|styl|less|sass|scss|png|jpg|ttf|woff|woff2)$": "identity-obj-proxy"
    }
  }

рдпрд╣ рдореЗрд░рд╛ рджрд┐рди рдмрдЪрд╛рддрд╛ рд╣реИред рдзрдиреНрдпрд╡рд╛рдж!!ред

@mbaranovski рдпрд╣ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рдерд╛ рдЬрдм рдореИрдВ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдЬреЗрд╕реНрдЯ рджреМрдбрд╝рддрд╛ рдерд╛ред рдЕрдлрд╕реЛрд╕ рдХреА рдмрд╛рдд рд╣реИ рдХрд┐ рдЬрдм рдореИрдВ рдХреНрд░рд┐рдПрдЯ-рд░рд┐рдПрдХреНрд╢рди-рдРрдк рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реВрдВ рддреЛ рдореБрдЭреЗ рдорд┐рд▓рддрд╛ рд╣реИ

Out of the box, Create React App only supports overriding these Jest options

рдХреНрдпрд╛ рдЗрд╕рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХреЛрдИ рдХрд╛рд░реНрдп рд╣реИ ? рдпрд╛ рдПрдХрдорд╛рддреНрд░ рд╕рдорд╛рдзрд╛рди рдХреНрд░рд┐рдПрдЯ-рд░рд┐рдПрдХреНрд╢рди-рдРрдк рдХреЛ рдмрд╛рд╣рд░ рдХрд░рдирд╛ рд╣реИ?

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╕реАрдЖрд░рдП рдЙрд╕ рд╡рд┐рдХрд▓реНрдк рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рдмрдВрдж рдХреНрдпреЛрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рд╢рд╛рдпрдж рдПрдХ рдЕрдЪреНрдЫрд╛ рдХрд╛рд░рдг ЁЯЩВ

/рд╕реАрд╕реА @gaearon

рдПрдХ рдФрд░ рдЙрдкрд╛рдп:

npm i --save-dev jest-transform-stub
"jest": {
  "transform": {
    ".+\\.(css|styl|less|sass|scss|png|jpg|ttf|woff|woff2)$": "jest-transform-stub"
  }
}

рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╣реИ рджреЗрд╢реА рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдЫрд╡рд┐рдпрд╛рдВ рд╣реИрдВред рдореИрдВрдиреЗ рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИ assetsTransformer , identity-obj-proxy рдФрд░ jest-transform-stub ред рдХреЗрд╡рд▓ рд╕рдВрдкрддреНрддрд┐ рдЯреНрд░рд╛рдВрд╕рдлрд╛рд░реНрдорд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рд╣рд╛рдп @ sibinx7 рдореИрдВрдиреЗ рдЙрд╕ рдореБрджреНрджреЗ рдХреЛ рдареАрдХ рдХрд┐рдпрд╛: https://github.com/facebook/jest/issues/2663/#issuecomment -317109798

рдореИрдВрдиреЗ рдЗрд╕реЗ jest-react-native рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рд▓ рдХрд┐рдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣рд╛рдВ рд╕рднреА рд╕рдорд╛рдзрд╛рди рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рд░рдЧрд░ рдирд╣реАрдВ рдереЗред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдореЗрд░реА рд╕рдорд╕реНрдпрд╛ рдПрдХ рдЕрд▓рдЧ рд╣реЛ, рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ react-native-router-flux -рдкреИрдХреЗрдЬ рдХреЗ рдЕрдВрджрд░ рдмреИрдареЗ рдкреАрдПрдирдЬреА рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ рд╕рдорд╕реНрдпрд╛рдПрдВ рдЖрдИ рд╣реИрдВред

рдпрд╣рд╛рдБ рдореЗрд░реА package.json рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдХреБрдЫ рдЕрдВрд╢:

{
  // ... 
  "devDependencies": {
    // ...
    "jest": "^23.4.1",
    "jest-react-native": "^18.0.0",
  },
  "jest": {
    "preset": "jest-react-native",
    "verbose": true,
    "modulePathIgnorePatterns": [
      "<rootDir>/node_modules/react-native/Libraries/react-native/",
      "<rootDir>/node_modules/react-native/packager/"
    ],
    "transformIgnorePatterns": [
      "node_modules/(?!((jest-)?react-native|react-clone-referenced-element|react-navigation|react-native-router-flux))"
    ]
  },
  // ...
}

рдПрдХреНрд╕рдПрдордПрд▓ рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рд╕рдВрд╢реЛрдзрди, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдо рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░:

jest.config.js

module.exports = {
    transform: {
        ".+.(xml|bpmn)": "<rootDir>/src/__tests__/transformers/xmlTransformer.ts"
    },
}

/src/__tests__/transformers/xmlTransformer.ts (рдЖрдкрдХреЗ рдкрде рдореЗрдВ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ,рдПрдХ рд╕рд╣рд╛рдпрдХ рд╣реИ рдЬреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рдореВрд▓ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ)ред

module.exports = {
    process() {
        return 'module.exports = {};';
    },
    getCacheKey() {
        // The output is always the same.
        return 'xmlTransform';
    },
};

рдЕрдзрд┐рдХ рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ рджреЗрдЦреЗрдВред

http://facebook.github.io/jest/docs/tutorial-webpack.html#content . рджреЗрдЦреЗрдВ

рджрд┐рдпрд╛ рдЧрдпрд╛ рд▓рд┐рдВрдХ рдЯреВрдЯрд╛ рд╣реБрдЖ рд╣реИ

@magnusart

"jest": {
    "moduleNameMapper": {
      ".+\\.(css|styl|less|sass|scss|png|jpg|ttf|woff|woff2)$": "identity-obj-proxy"
    }
  }

рдпрд╣ рдореЗрд░рд╛ рджрд┐рди рдмрдЪрд╛рддрд╛ рд╣реИред рдзрдиреНрдпрд╡рд╛рдж!!ред

рдореИрдВрдиреЗ рдЗрд╕рд╕реЗ рдПрдХ рд╕рдВрдХреЗрдд рд▓рд┐рдпрд╛ рдФрд░ babel-jest рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдФрд░ рдлрд┐рд░ рдореИрдВрдиреЗ identity-obj-proxy рдХреЛ babel-jest рд╕реЗ рдмрджрд▓ рджрд┐рдпрд╛

рдпрд╛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ https://github.com/eddyerburgh/jest-transform-stub

рдХреЗрд╡рд▓ @eddyerburgh рдХреЗ рд╕рдорд╛рдзрд╛рди рдиреЗ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд┐рдпрд╛ред

@magnusart
рддреБрдо рдореЗрд░рд╛ рджрд┐рди рдмрдЪрд╛рдУ, рдпрд╣ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ

./node_modules/react-native-gesture-handler/jestSetup.js рд╕реЗ setupFiles рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рдж рдореБрдЭреЗ рдпрд╣ рдкреАрдПрдирдЬреА рд╕рдорд╕реНрдпрд╛ рдереА (рдпрд╣ react-native-gesture-handler рдХреЗ рд╕рд╛рде рдЬреЗрд╕реНрдЯ рдореБрджреНрджреЗ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рдореЗрд░рд╛ рдкреНрд░рдпрд╛рд╕ рдерд╛)ред

рдореИрдВрдиреЗ рдХреЛрд╢рд┐рд╢ рдХреА https://github.com/facebook/jest/issues/2663#issuecomment -341384494 ( @magnusart identity-obj-proxy рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ), рд▓реЗрдХрд┐рди рдЗрд╕рдиреЗ рдХрд┐рд╕реА рднреА рдХрд╛рд░рдг рд╕реЗ enzyme рдХреЛ рддреЛрдбрд╝рд╛ (рдЗрд╕рдиреЗ enzyme рдмрдирд╛рдпрд╛) mock рдПрдХ рд╕рдорд╛рд░реЛрд╣ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдкреНрд░рддреАрдХ рдореЗрдВ)ред рдлрд┐рд░ рдореИрдВрдиреЗ рдХреЛрд╢рд┐рд╢ рдХреА https://github.com/facebook/jest/issues/2663#issuecomment -369040789 (@eddyerburgh
jest-transform-stub рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ), рд▓реЗрдХрд┐рди рдЗрд╕рдиреЗ рдХреБрдЫ рдирд╣реАрдВ рдХрд┐рдпрд╛ред

рдЖрдЦрд┐рд░рдХрд╛рд░, рдореИрдВрдиреЗ https://github.com/facebook/jest/issues/2663#issuecomment -274270387 ( @cpojer рд╢реБрд░реБрдЖрдд рдореЗрдВ webpack рд╕рдорд╛рдзрд╛рди) рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рдФрд░ рд╡рд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХрдорд╛рддреНрд░ рдерд╛ред

рдЕрдЧрд░ рдХрд┐рд╕реА рдХреЛ рдПрд╕рд╡реАрдЬреА рдХреЗ рд╕рд╛рде рдпрд╣ рддреНрд░реБрдЯрд┐ рдорд┐рд▓ рд░рд╣реА рд╣реИ, рддреЛ рд╢рд╛рдпрдж рдЗрд╕ lib рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ https://www.npmjs.com/package/jest-svg-transformer

рдореИрдВрдиреЗ рдХреЗрд╡рд▓ рдЕрдкрдиреЗ jest.config.ts рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдпрд╣ рдХреЛрдб рдЬреЛрдбрд╝рд╛ рд╣реИ

transform: { '^.+\\.tsx?$': 'babel-jest', '^.+\\.svg$': 'jest-svg-transformer', },

рдФрд░ рдЗрд╕ рдлрд╛рдЗрд▓ рдкрд░ рдХреЛрдб рдпрд╣ рд╣реИ
Captura de Tela 2020-11-09 a╠Аs 13 17 01

рдЖрдк рд▓реЛрдЧ рдореЙрдбреНрдпреВрд▓рдирд╛рдордореИрдкрд░ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рд┐рд░реНрдл рдЗрд╕рд▓рд┐рдП рдХрд┐ рдореИрдВ рдмреЗрдмреЗрд▓ рдХреЗ рд╕рд╛рде рдХрд╕реНрдЯрдо рдЖрдпрд╛рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ

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

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

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

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

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

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

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