рдореИрдВ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрд╣ рддреНрд░реБрдЯрд┐ рдорд┐рд▓ рд░рд╣реА рд╣реИ:
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';
рдзрдиреНрдпрд╡рд╛рдж!
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))"
]
},
// ...
}
рдПрдХреНрд╕рдПрдордПрд▓ рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рд╕рдВрд╢реЛрдзрди, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдо рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░:
module.exports = {
transform: {
".+.(xml|bpmn)": "<rootDir>/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',
},
рдФрд░ рдЗрд╕ рдлрд╛рдЗрд▓ рдкрд░ рдХреЛрдб рдпрд╣ рд╣реИ
рдЖрдк рд▓реЛрдЧ рдореЙрдбреНрдпреВрд▓рдирд╛рдордореИрдкрд░ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рд┐рд░реНрдл рдЗрд╕рд▓рд┐рдП рдХрд┐ рдореИрдВ рдмреЗрдмреЗрд▓ рдХреЗ рд╕рд╛рде рдХрд╕реНрдЯрдо рдЖрдпрд╛рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╣реА рддреНрд░реБрдЯрд┐ рдереА рдФрд░ рдЗрд╕реЗ рд╕рдВрдкрддреНрддрд┐ рдЯреНрд░рд╛рдиреНрд╕рдлрд╝реЙрд░реНрдорд░.рдЬреЗрдПрд╕ рдмрдирд╛рдХрд░ рд╣рд▓ рдХрд┐рдпрд╛:
рдлрд┐рд░ рдЗрд╕реЗ 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