Jest: [рдмрдЧ] рдЕрд▓рдЧ-рдЕрд▓рдЧ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдореЗрдВ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдореИрдиреБрдЕрд▓ рдореЙрдХ рдорд┐рд▓рд╛

рдХреЛ рдирд┐рд░реНрдорд┐рдд 9 рдирд╡ре░ 2016  ┬╖  66рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: facebook/jest

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

рд╡рд░реНрддрдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рдХреНрдпрд╛ рд╣реИ?

рдПрдХ рдлрд╝рд╛рдЗрд▓ рдЯреНрд░реА рджрд┐рдпрд╛:

src/app/modules
тФЬтФАтФА module1
тФВ┬а┬а тФЬтФАтФА index.js
тФВ┬а┬а тФЬтФАтФА __tests__/
тФЬтФАтФА module2
тФВ┬а┬а тФЬтФАтФА index.js
тФВ┬а┬а тФЬтФАтФА __tests__/

рдореИрдВ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдирд╛рдо рд╕реЗ рдЙрдиреНрд╣реЗрдВ рдЖрдпрд╛рдд рдХрд░рдХреЗ modules рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЗ рдмрд╛рд╣рд░ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ:

import Module1 from '../modules/module1';
import Module2 from '../modules/module2';

рдореИрдВ module1 рдФрд░ module2 рдореЙрдХ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдЧрд░ рдореИрдВ рдмрдирд╛рдиреЗ src/app/modules/module1/__mocks__/index.js рдФрд░ src/app/modules/module2/__mocks__/index.js , рдореИрдВ рджрд┐рдпрд╛ рд╣реВрдБ duplicate manual mock found рддреНрд░реБрдЯрд┐ рд╕реЗ jest-haste-map ред

рдЕрдЧрд░, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореИрдВ src/app/modules/__mocks__/{module1.js,module2.js} рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдирдХрд▓реА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдпрджрд┐ рд╡рд░реНрддрдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рдмрдЧ рд╣реИ, рддреЛ рдХреГрдкрдпрд╛ рдкреБрди: рдкреЗрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЪрд░рдг рдкреНрд░рджрд╛рди рдХрд░реЗрдВ рдФрд░ рдпрджрд┐ рд╕рдВрднрд╡ рд╣реЛ рддреЛ GitHub рдкрд░ рдПрдХ рдиреНрдпреВрдирддрдо рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╣реИ рдХрд┐ рд╣рдо npm install рдФрд░ npm test рдХрд░ рд╕рдХреЗрдВред

рдКрдкрд░ рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рджреЗрдЦреЗрдВред

рдЕрдкреЗрдХреНрд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреНрдпрд╛ рд╣реИ?

рдореИрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╛ рддреЛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рдЙрдореНрдореАрдж рдХрд░реВрдВрдЧрд╛, рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдкрд╣рд▓рд╛ рдорд╛рдорд▓рд╛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд░рд╛рд╕реНрддреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░ рджреВрд╕рд░рд╛ рдорд╛рдорд▓рд╛ рдореЙрдбреНрдпреВрд▓ рдХреЗ рдкрдердирд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

--debug рд╕рд╛рде рдлрд┐рд░ рд╕реЗ рдЬреЗрд╕реНрдЯ рдЪрд▓рд╛рдПрдВ рдФрд░ рдЗрд╕реЗ рдкреВрд░рд╛ рдкреНрд░рд┐рдВрдЯ рдкреНрд░рджрд╛рди рдХрд░реЗрдВред

рдиреЛрдб v6.2.0
npm v3.8.9
OS X 10.11.6

> NODE_ENV=test jest --env jsdom "--debug" "src/app/redux/modules/devices"

jest version = 17.0.0
test framework = jasmine2
config = {
  "moduleFileExtensions": [
    "js",
    "json"
  ],
  "moduleDirectories": [
    "node_modules"
  ],
  "moduleNameMapper": [
    [
      "^.+\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$",
      "/Users/paul/dev/tools/jest/mock-assets.js"
    ],
    [
      "^.+\\.css$",
      "identity-obj-proxy"
    ]
  ],
  "name": "dev",
  "setupTestFrameworkScriptFile": "/Users/paul/dev/tools/jest/setup-framework.js",
  "testPathDirs": [
    "/Users/paul/dev/src"
  ],
  "testRegex": "/__tests__/.*\\.test\\.js$",
  "timers": "fake",
  "rootDir": "/Users/paul/dev",
  "setupFiles": [],
  "testRunner": "/Users/paul/dev/node_modules/jest-jasmine2/build/index.js",
  "testEnvironment": "/Users/paul/dev/node_modules/jest-environment-jsdom/build/index.js",
  "transform": [
    [
      "^.+\\.jsx?$",
      "/Users/paul/dev/node_modules/babel-jest/build/index.js"
    ]
  ],
  "usesBabelJest": true,
  "automock": false,
  "bail": false,
  "browser": false,
  "cacheDirectory": "/var/folders/dm/vt920lmd6tzdq_709zkykwx40000gn/T/jest",
  "coveragePathIgnorePatterns": [
    "/node_modules/"
  ],
  "coverageReporters": [
    "json",
    "text",
    "lcov",
    "clover"
  ],
  "expand": false,
  "globals": {},
  "haste": {
    "providesModuleNodeModules": []
  },
  "mocksPattern": "__mocks__",
  "modulePathIgnorePatterns": [],
  "noStackTrace": false,
  "notify": false,
  "preset": null,
  "resetMocks": false,
  "resetModules": false,
  "snapshotSerializers": [],
  "testPathIgnorePatterns": [
    "/node_modules/"
  ],
  "testURL": "about:blank",
  "transformIgnorePatterns": [
    "/node_modules/"
  ],
  "useStderr": false,
  "verbose": null,
  "watch": false,
  "cache": true,
  "watchman": true,
  "testcheckOptions": {
    "times": 100,
    "maxSize": 200
  }
}
jest-haste-map: duplicate manual mock found:
  Module name: index
  Duplicate Mock path: /Users/paul/dev/src/app/modules/push-notification-manager/__mocks__/index.js
This warning is caused by two manual mock files with the same file name.
Jest will use the mock file found in:
/Users/paul/dev/src/app/modules/push-notification-manager/__mocks__/index.js
 Please delete one of the following two files:
 /Users/paul/dev/src/app/modules/image-file/__mocks__/index.js
/Users/paul/dev/src/app/modules/push-notification-manager/__mocks__/index.js


No tests found
  1 file checked.
  testPathDirs: /Users/paul/dev/src - 1 match
  testRegex: /__tests__/.*\.test\.js$ - 0 matches
  testPathIgnorePatterns: /node_modules/ - 1 match
Enhancement Confirmed Help Wanted

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

рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рдиреЗ рд▓рдЧрддрд╛ рд╣реИред jest.config.js рдореЗрдВ:

module.exports = {
  // ...
  modulePathIgnorePatterns: ["<rootDir>/.*/__mocks__"]
};

рдореИрдВ рдЗрд╕ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рджрд╛рдпрд░реЗ рдпрд╛ рдкреНрд░рднрд╛рд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдЫреЛрдЯреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╣реИред

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

+1

рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, cacheDirectory / var / рдлрд╝реЛрд▓реНрдбрд░реЛрдВ / dm / vt920lmd6tzdq_709zkykwx40000gn / T / jest рдФрд░ рдкреБрди: npm рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрдирд╛рдУрдВ рдХреЗ рдмрд╛рдж, рдпреЗ рд╕рдВрджреЗрд╢ рдЧрд╛рдпрдм рдХрд░ рджрд┐рдП рдЧрдП рд╣реИрдВред

рдпрд╣рд╛рдБ рдЕрдкрдорд╛рдирдЬрдирдХ рдХреЛрдб рд╣реИ:

https://github.com/facebook/jest/blob/cd8976ec50dbed79cfe07f275052cdd80d466e73/packages/jest-haste-map/src/index.js#L98

рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡реНрдпрд╡рд╣рд╛рд░ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╡рд╛рдВрдЫрд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рдкрд░реАрдХреНрд╖рдг рд╣реИ:

https://github.com/facebook/jest/blob/8de90b320c87a0a36d68f6bd8177620a985df269/packages/jest-haste-map/src/__tests__/__snapshots__/index-test.js.nnap#L1515

рдЬрд┐рд╕рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛:

https://github.com/facebook/jest/commit/cfade282fbbe2737b6dd2cee1cf3da3ee8624512

рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рд╣рдо рдХреБрдВрдЬреА рдХреЗ рд░реВрдк рдореЗрдВ рдкреВрд░реЗ рд░рд╛рд╕реНрддреЗ рдХреЗ рдмрдЬрд╛рдп basename рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ?

/ cc @flarnie

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

import { MyWhatever } from 'models/MyWhatever/schema';
import { MyOtherWhatever } from 'models/MyOtherWhatever/schema';

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

рдпрджреНрдпрдкрд┐ рд╕рдорд╛рдзрд╛рди рддреБрдЪреНрдЫ рд╣реИ (s / рд╕реНрдХреАрдорд╛ / MyWhateverSchema /), рдпрд╣ рдЬреИрд╕реНрдЯ рдХреЛ рдЦреБрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧреИрд░-рдкрд░реАрдХреНрд╖рдг рдХреЛрдб рдХрд╛ рдирд╛рдо рдмрджрд▓рдиреЗ рдФрд░ рдкреБрдирд░реНрдЧрдарди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрдЧ рдЬреИрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИред

рд╣рд╛рдБ, рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЪреВрд╕рдирд╛ рд╣реИред рдореИрдиреБрдЕрд▓ рдореЙрдХрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рдореБрдЭреЗ рдкреАрдЖрд░ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛ рд░рд╣реА рд╣реИ рдЬреЛ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░реЗрдЧрд╛, рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП рдХрд┐ рд╣рдо рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдПрдлрдмреА рдХреЗ рд╕рднреА рдХреЛ рддреЛрдбрд╝ рди рджреЗрдВ (рд▓реЗрдХрд┐рди рдореИрдВ рдЙрд╕ рдХрд╛ рдзреНрдпрд╛рди рд░рдЦ рд╕рдХрддрд╛ рд╣реВрдВ :))

рдардВрдбрд╛ред рдореБрдЭреЗ рдХрд▓ рдХреБрдЫ рд╕рдордп рдХреЗ рд▓рд┐рдП рдПрдХ рдкреИрдЪ рдкрдХрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЛрдИ рд╡рд╛рджрд╛ рдирд╣реАрдВ рд╣реИ рд╣рд╛рд▓рд╛рдВрдХрд┐ tomorrow

@cpojer рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдХреЛрдИ рд╡рд┐рд╢реЗрд╖ рдХрд╛рд░рдг

рдпрд╣ рдЗрд╕ рддрдереНрдп рдХреЗ рд╕рд╛рде рдХреБрдЫ рднреА рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ fb рдореЙрдбреНрдпреВрд▓ рдХреЗ рд▓рд┐рдП рдЕрджреНрд╡рд┐рддреАрдп рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ? рдореИрдВ рдирд╣реАрдВ рджреЗрдЦрддреА рдЕрдиреНрдпрдерд╛ рдХреИрд╕реЗ рдПрдХ рд╣реА рдирд╛рдо рдХреЗ рд╕рд╛рде рджреЛ рдирдХрд▓реА рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИ рдХреЛрдИ рдорддрд▓рдм ...

рд╣рд╛рдБ, рдирдХрд▓реА "рд╡реИрд╢реНрд╡рд┐рдХ" рднреА рд╣реИрдВред рдпрд╣ рдПрдХ рднрдпрд╛рдирдХ рдбрд┐рдЬрд╛рдЗрди рд╣реИ рдЬрд┐рд╕реЗ рд╣рдореЗрдВ рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдЬреАрдирд╛ рд╣реЛрдЧрд╛ред FB рдореЗрдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЧрд▓рдд рд╕реНрдерд╛рди рдкрд░ 4000+ рдирдХрд▓реА рдлрд╝рд╛рдЗрд▓реЗрдВ рд╣реИрдВ (рдФрд░ рдЕрдХреНрд╕рд░ рд╡рд╣рд╛рдБ рднреА рдЙрдЪрд┐рдд рд╕реНрдерд╛рди рдирд╣реАрдВ рд╣реИ)ред рдпрд╣ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рд╣рдо рдЗрд╕реЗ рдЕрдЧрд▓реЗ рдЖрдзреЗ рд╣рд┐рд╕реНрд╕реЗ рдореЗрдВ рдареАрдХ рдХрд░ рджреЗрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рдЬреЗрд╕реНрдЯ рдореЗрдВ рд╕реБрдзрд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдореБрдЭреЗ рдкреАрдЖрд░рдПрд╕ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛ рд░рд╣реА рд╣реИ рдЬреЛ рдЦреБрд▓реЗ рд╕реНрд░реЛрдд рдХреЗ рд▓рд┐рдП рдЬреЗрд╕реНрдЯ рдореЗрдВ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ - рдЕрдЧрд░ рд╣рдо рдЬреЗрдмреА рдХреЗ рд▓рд┐рдП рдкреБрд░рд╛рдиреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдЕрднреА рдХреЗ рд▓рд┐рдП рдПрдлрдмреА рдкрд░ рдмрдирд╛рдП рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВред

@cpojer рдПрдХ рдЭрдВрдбреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреИрд╕реЗ? рдХреНрдпрд╛ рдЖрдк рдПрдХ рдРрд╕рд╛ рдЬрдирд╕рдВрдкрд░реНрдХ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдВрдЧреЗ рдЬреЛ рдЗрд╕реЗ рдзреНрд╡рдЬ рдХреЗ рд╕рд╛рде рд╕рдХреНрд╖рдо / рдЕрдХреНрд╖рдо рдХрд░рддрд╛ рд╣реЛ?

рд╣рд╛рдБ, рдпрд╣ рдПрдХ рд╡рд┐рдиреНрдпрд╛рд╕ рд╡рд┐рдХрд▓реНрдк рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди рдореИрдВ рд╕рд┐рд░реНрдл рдЪреЗрддрд╛рд╡рдиреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдореИрдВ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдлреАрдЪрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреА рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

@ cpojer рд╕рд╣реА - рдпрд╣ рд╕реНрдкрд░реНрд╢ рдЬрд╕реНрдЯ рдХреЗ рдХрд┐рди рд╣рд┐рд╕реНрд╕реЛрдВ рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ?

рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдХреЛрдб рдХреЛ jest-runtime рд╕реЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ: https://github.com/facebook/jest/blob/master/packages/jest-runtime/src/index.js рдФрд░ рдХрд╣реАрдВ рди рдХрд╣реАрдВ рдЬреЗрд╕реНрдЯ-рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдФрд░ рдЬреЗрд╕реНрдЯ-рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди-рдирд┐рд░реНрднрд░рддрд╛ рдореЗрдВ рд╣реИ ред

@ рд╕рдВрдХреЗрдд

@cpojer рдиреЗ рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП JEST_USE_BASENAME_FOR_CACHING рдЬреИрд╕реЗ рдХреБрдЫ рд╡реИрд╢реНрд╡рд┐рдХ рдУрд╡рд░рд░рд╛рдЗрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рдХрд╣рд╛?

рдХрдо рд╕реЗ рдХрдо, рд╣рдо рдЧреИрд░-рдЕрджреНрд╡рд┐рддреАрдп рдлрд╝рд╛рдЗрд▓рдирд╛рдореЛрдВ рдХрд╛ рдЖрдирдВрдж рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рдПрдлрдмреА рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рддреЛрдбрд╝ рджреЗрдЧрд╛ред

рдмреЗрд╢рдХ, рдпрд╣ рдПрдХ рдЕрд╕реНрдерд╛рдпреА рд╕рдорд╛рдзрд╛рди рд╣реИред

рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ, рдпрд╣ рдХреБрдЫ /etc/profile рдпрд╛ ~/.bashrc

export JEST_USE_BASENAME_FOR_CACHING="true"

(рдпрд╛ рдПрдирд╡реА рдХреЗ рд╕рд╛рде рдХреБрдЫ рдлрд╝рд╛рдЗрд▓)
рдФрд░ рдлрд┐рд░

$ jest

рдпрд╛ рдпрд╣ рдПрдХ, рдмрд┐рдирд╛ рдПрдирд╡реА рдлрд╛рдЗрд▓ рд╕рдВрд╢реЛрдзрдиреЛрдВ рдХреЗ:

$ JEST_USE_BASENAME_FOR_CACHING="true" jest

рдЖрдкрдХреЛ рдХреНрдпрд╛ рд▓рдЧрддрд╛ рд╣реИ? рдпрд╣ рд╣реИрдХ рдХреА рддрд░рд╣ рд╣реИ рдпрд╛ рдпрд╣ рдареАрдХ рд╣реИ? :рдЖрдБрдЦ рдорд╛рд░рдирд╛:

рдореИрдВрдиреЗ рд╕рд┐рд░реНрдл рдПрдХ рдирдП рд░реЗрдкреЛ рдХреЗ рд╕рд╛рде рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛, рдЬреЗрд╕реНрдЯ рдХреЗ рджреЛ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ ( ^15.0.0 рдФрд░ ^17.0.0 ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдФрд░, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдмрд╛рдж рд╡рд╛рд▓рд╛ рдЪреЗрддрд╛рд╡рдиреА рджреЗрддрд╛ рд╣реИ, рдкрд░реАрдХреНрд╖рдг рдЕрдкреЗрдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИред

@ColCh рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣рд╛рдБ рдореБрджреНрджрд╛ рдХреИрд╢ рдХреЗ рд╕рд╛рде рд╣реИ, рд╢рд╛рдпрдж рдПрдХ рдЕрдзрд┐рдХ рдЙрдкрдпреБрдХреНрдд рдирд╛рдо JEST_USE_BASENAME_FOR_MOCKING ред

@cpojer рдпрджрд┐ FB рдХреЛрдб рдореЗрдВ рдирд╛рдореЛрдВ рдХреА рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛ рдкрд░ рдкреНрд░рддрд┐рдмрдВрдз рд╣реИ, рддреЛ mocks рдХреЗ рдорд╛рдирдЪрд┐рддреНрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреБрдВрдЬреА рдХреЗ рд░реВрдк рдореЗрдВ рдкреВрд░реНрдг рдкрде рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рд╕рдорд╕реНрдпрд╛рдПрдВ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред

рдХреНрдпрд╛ рдореИрдВ рд╕рд╣реА рд╣реВрдВ рдпрд╛ рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬреЛ рдореИрдВ рдирд╣реАрдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВ?

рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рджреЗрдЦреЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рджреЛ рд╕рдорд╛рдзрд╛рди рд╣реИрдВ:

  • рдмреЗрд╕рдиреЗрдо рдпрд╛ рдкреВрд░реНрдг рдкрде рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд╡рд┐рдХрд▓реНрдк рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП getMockName рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░реЗрдВ
  • рдЙрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╣рдЯрд╛ рджреЗрдВ

рдЗрд╕ рдкрд░ @cpojer рдЬрд╡рд╛рдм рджреЗрдЦрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛

рд╣реЗ рд╕рдм рд▓реЛрдЧ, рджреЗрд░реА рдХреЗ рд▓рд┐рдП рдЦреЗрдж рд╣реИ, рдореИрдВ рдЕрднреА рд╕рд╛рдорд╛рди рдХреА рдПрдХ рдЯрди рдХреЗ рд╕рд╛рде рд╡рд╛рдкрд╕ рдЖ рдЧрдпрд╛ рд╣реВрдБред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдареАрдХ рд╣реВрдВ рдЕрдЧрд░ рдЖрдк рд▓реЛрдЧ рдЬреЗрд╕реНрдЯ рдореЗрдВ рдЬреЛ рдХреБрдЫ рднреА рдмрджрд▓рддреЗ рд╣реИрдВ рдЙрд╕реЗ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдЗрд╕ рдкреНрд░рдгрд╛рд▓реА рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдореИрдиреБрдЕрд▓ рдореЙрдХрд┐рдВрдЧ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЧрдбрд╝рдмрдбрд╝ рд╣реИ рдФрд░ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рд╣рдо рдЬрд┐рд╕ рддрд░рд╣ рдХрд╛ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд╡рд╣ рдПрдХ рд╡рд┐рдиреНрдпрд╛рд╕ рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ "рдЬрд▓реНрджрдмрд╛рдЬреА рдореЙрдбреНрдпреВрд▓" (рдЖрдВрддрд░рд┐рдХ FB рдореЙрдбреНрдпреВрд▓ рд╕рд┐рд╕реНрдЯрдо) рдХреЗ рджрд╛рдпрд░реЗ рдХреЛ рд╕реАрдорд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬреИрд╕реЗ "haste_modules": ['path/a', 'path/b']" рдФрд░ рдлрд┐рд░ рдЙрди рдлрд╝реЛрд▓реНрдбрд░реЛрдВ рдореЗрдВ рдЬрд▓реНрджрдмрд╛рдЬреА рдореЗрдВ рдореЙрдбреНрдпреВрд▓ рджреЗрдЦреЗрдВ, рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рдЕрдЬреАрдм рдореЙрдХрд┐рдВрдЧ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИред рд╡реНрдпрд╡рд╣рд╛рд░ред рдЕрдЧрд░ рдХреЛрдИ рднреА рдпрд╣ рдмрджрд▓рд╛рд╡ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд╣реЛрдЧрд╛ред

рдПрдХ рдмрд╛рдд рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рд╣реИ: рдпрджрд┐ рд╕рднреА рдореИрдиреБрдЕрд▓ рдореЛрдХреНрд╕ рд╕реНрдерд╛рдиреАрдп рд╣реИрдВ, рдЬреИрд╕реЗ __mocks__/a.js рдореИрдкреНрд╕ рд╕реЗ a.js , рддреЛ рд╣рдо рдиреЛрдб_рдореЙрдбрд▓ рдореЛрдХреНрд╕ рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░рддреЗ рд╣реИрдВ? рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреБрдЫ рддрд░реАрдХреЗ рд╣реИрдВ:

  • рдПрдХ рдирдпрд╛ __node_modules_mocks__ рдлрд╝реЛрд▓реНрдбрд░ рдкреЗрд╢ рдХрд░реЗрдВ рд▓реЗрдХрд┐рди рд╡рд╣ рдмрджрд╕реВрд░рдд рд╣реИред
  • rootDir (рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд░реВрдЯ) рд╕реЗ рджреЗрдЦрд╛ рдЧрдпрд╛ рд╢реАрд░реНрд╖ рд╕реНрддрд░ __mocks__ рдлрд╝реЛрд▓реНрдбрд░ рд╡реИрд╢реНрд╡рд┐рдХ рдлрд╝реЛрд▓реНрдбрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдЗрд╕рд▓рд┐рдП рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ:

  • рдЬреЗрд╕реНрдЯ рдореЗрдВ рдореИрдиреБрдЕрд▓ рдореЛрдХреНрд╕ рдХреЛ рдареАрдХ рдХрд░рддреЗ рд╣реИрдВ!
  • рдЖрдЗрдП рдирд╛рдо рд╕реНрдерд╛рди рдЬрд▓реНрджрдмрд╛рдЬреА рдореЙрдбреНрдпреВрд▓ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдХреБрдЫ рдлрд╝реЛрд▓реНрдбрд░реНрд╕ / regex рддрдХ рд╕реАрдорд┐рдд рдХрд░реЗрдВред
  • рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдореЙрдХрд┐рдВрдЧ рд╡реНрдпрд╡рд╣рд╛рд░ рдЕрднреА рднреА рдПрдлрдмреА рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЬрд▓реНрджрдмрд╛рдЬреА рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдлрд╝реЛрд▓реНрдбрд░реНрд╕ рдХреЛ рд╕рдлрд╝реЗрдж рдХрд░рдирд╛ рд╣реЛрдЧрд╛ (рдпрд╣ рдЕрднреА рд╣рдорд╛рд░реЗ рд▓рд┐рдП ["<rootDir>"] рдЬреИрд╕рд╛ рд▓рдЧреЗрдЧрд╛, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ)
  • рдкрддрд╛ рд▓рдЧрд╛рдПрдБ рдХрд┐ рдХреИрд╕реЗ рдЕрднреА рднреА рдиреЛрдб рдореЙрдбреНрдпреВрд▓ рдХреЛ рдореЙрдХ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИред

рддреБрдо рдХреНрдпрд╛ рд╕реЛрдЪрддреЗ рд╣реЛ?

рдХреНрд░рдо рдореЗрдВ:

  • рдЬреЗрд╕реНрдЯ рдореЗрдВ рдореИрдиреБрдЕрд▓ рдореЛрдХреНрд╕ рдХреЛ рдареАрдХ рдХрд░рддреЗ рд╣реИрдВ!

рд╣реБрд░реНрд░реА: рдореБрд╕реНрдХрд╛рди:: рддрджрд╛:

  • рдЖрдЗрдП рдирд╛рдо рд╕реНрдерд╛рди рдЬрд▓реНрджрдмрд╛рдЬреА рдореЙрдбреНрдпреВрд▓ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдХреБрдЫ рдлрд╝реЛрд▓реНрдбрд░реНрд╕ / regex рддрдХ рд╕реАрдорд┐рдд рдХрд░реЗрдВред
  • рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдореЙрдХрд┐рдВрдЧ рд╡реНрдпрд╡рд╣рд╛рд░ рдЕрднреА рднреА рдПрдлрдмреА рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЬрд▓реНрджрдмрд╛рдЬреА рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдлрд╝реЛрд▓реНрдбрд░реНрд╕ рдХреЛ рд╕рдлрд╝реЗрдж рдХрд░рдирд╛ рд╣реЛрдЧрд╛ (рдпрд╣ рд╕рд┐рд░реНрдл рдРрд╕рд╛ рд▓рдЧреЗрдЧрд╛ """рдЕрднреА рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рд▓рд┐рдП, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ)

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ рдЬрд▓реНрджрдмрд╛рдЬреА рдХреЗ рд╕рд╛рде рдЬрд░реВрд░рддреЛрдВ рдХреЛ рд╕рдордЭрддрд╛ рд╣реВрдВред
рдЖрдкрдХреЗ рдХрд╣рдиреЗ рдХрд╛ рдорддрд▓рдм "рдЙрди рдореЙрдбреНрдпреВрд▓ рдХреЛ рдЬрд▓реНрджрдмрд╛рдЬреА рдореЗрдВ рдореЙрдбреНрдпреВрд▓" рдХрд╣рдирд╛ рд╣реИ?
рдЕрдЧрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЪрд╛рд░ рдореЙрдбреНрдпреВрд▓ рд╣реИрдВ: /path_1/a , /path_1/b , /path_2/a , /path_2/c , рдФрд░ рд╕реЗрдЯрд┐рдВрдЧ:

"haste_modules:" ["/path_1/a", "/path_2/c"]

рдХреЗрд╡рд▓ /path_1/a рдФрд░ /path_1/b рдХреЗрд╡рд▓ /path_1 , рдЗрд╕рд▓рд┐рдП /path_2/c рдорд╛рдиреНрдп рд╣реИ, рдФрд░ /path_2/a рдПрдХ рддреНрд░реБрдЯрд┐ / рдЪреЗрддрд╛рд╡рдиреА рдЙрдард╛рддрд╛ рд╣реИред

рдореИрдВ рдХрд╣рддрд╛ рд╣реВрдВ, рд▓рдХреНрд╖реНрдп рдЖрд╕рд╛рдиреА рд╕реЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдлрд╝рд╛рдЗрд▓реЗрдВ рдФрд░ рд╕рдВрдкреВрд░реНрдг рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдПрдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╕рд┐рдВрдЧрд▓ / рдбрдмрд▓ * ред

  • рдкрддрд╛ рд▓рдЧрд╛рдПрдБ рдХрд┐ рдХреИрд╕реЗ рдЕрднреА рднреА рдиреЛрдб рдореЙрдбреНрдпреВрд▓ рдХреЛ рдореЙрдХ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИред

рдореИрдВ рд╡рд░реНрддрдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рдмрдирд╛рдП

рдпрджрд┐ рдЖрдк рдЬрд┐рд╕ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдордЬрд╛рдХ рдЙрдбрд╝рд╛ рд░рд╣реЗ рд╣реИрдВ, рд╡рд╣ рдПрдХ рдиреЛрдб рдореЙрдбреНрдпреВрд▓ (рдЬреИрд╕реЗ: fs) рд╣реИ, рддреЛ рдореЙрдХ рдХреЛ рдЙрд╕реА рдореВрд▓ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдиреЛрдб_рдореЙрдбрд▓ рдлрд╝реЛрд▓реНрдбрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдореЗрд░реЗ рд╡рд┐рдЪрд╛рд░:

рдЬрд▓реНрджрдмрд╛рдЬреА рдореЙрдбреНрдпреВрд▓:

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, haste_modules рдЕрдЪреНрдЫрд╛ рд╣реИ, рдпрд╣ collectCoverageFrom рдФрд░ рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреА рддрд░рд╣ рдлрд┐рдЯ рдмреИрдарддрд╛ рд╣реИ: рдЧреНрд▓рдмреНрд╕ рдХреА рд╕рд░рдгреА
рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╕рднреА src _haste_ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рд╣реИрдВ, рдФрд░ рд╕рд┐рд░реНрдл рдПрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдЧреИрд░-рдЬрд▓реНрджрдмрд╛рдЬреА рд╣реИ:

haste_modules: [
  "src",
  "!src/foo"
]

рдиреЛрдб_рдореЙрдбреНрдпреВрд▓

@EnoahNetzach рдЕрдЧрд░ рдХрд┐рд╕реА рдХреЗ рдкрд╛рд╕ рдиреЛрдб рдФрд░ рдиреЛрдб рд╕реЗ рдРрдк рдореЙрдбреНрдпреВрд▓ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рдирд╛рдо рд╣реИрдВ рддреЛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛?


рдЗрд╕реЗ рдЬрд▓реНрджрдмрд╛рдЬреА рдХреЗ рдмрд┐рдирд╛ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП ... рд╣рдореНрдо, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

рджрд┐рдП рдЧрдП рдиреЛрдб рдореЙрдбреНрдпреВрд▓ project/node_modules/react , рдирдХрд▓реА project/__node_modules_mocks__/react.js рдЕрдВрджрд░ рд╣реЛрдВрдЧреЗ
рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ project/react.js рдлрд╝рд╛рдЗрд▓ рд╣реИ, рддреЛ project/__mocks__/react.js

(рдмреЗрд╢рдХ, react.js рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИред рдпрд╣рд╛рдВ рд╕рднреА рдореЙрдбреНрдпреВрд▓реЛрдВ рдХреЗ рдмреАрдЪ рдХреЛрдИ рднреА рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ npm рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдордЬрд╛рдХ node_modules рдореЙрдбреНрдпреВрд▓ рдореЗрд░реЗ рдЕрдиреБрднрд╡ рд╕реЗ рдПрдХ рджреБрд░реНрд▓рдн рдорд╛рдорд▓рд╛ рд╣реИ, рддреЛ ... рд╣реЛ рд╕рдХрддрд╛ рд╣реИ _rareness_ node_modules рдордЬрд╛рдХ рдХреЗ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рдореЗрдВ _ugliness_ рдХреНрд╖рддрд┐рдкреВрд░реНрддрд┐ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

рдиреЛрдб_рдореЙрдбреНрдпреВрд▓реНрд╕ рдХреЗ рдЕрдВрджрд░ рдХрд┐рд╕реА рдХрд╛ рднреА рдордЬрд╛рдХ рдЙрдбрд╝рд╛рдиреЗ рд╡рд╛рд▓реЗ рдореЙрдбреНрдпреВрд▓?

рдЖрдЧреЗ рдХреНрдпрд╛ рд╕реЛрдЪрдирд╛ рд╣реИ

рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рджреЗрдЦрд╛, рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛- рдореВрд▓рдХ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЕрдХреНрд╕рд░ application modules рдореЙрдХ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ рдФрд░ lodash )

рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕:

  • рдкреНрд░рддреНрдпреЗрдХ рдЧреВрдВрдЧрд╛ рдШрдЯрдХ рдХреЗ рд▓рд┐рдП рдореИрдиреБрдЕрд▓ рдирд┐рд░реНрдорд┐рдд рдирдХрд▓реА рдШрдЯрдХ (рдЧреВрдВрдЧрд╛ рдШрдЯрдХ рд▓реЗрдЖрдЙрдЯ рдШрдЯрдХ рд╣реИрдВ)
  • рд╣рд░ рдкрд░реАрдХреНрд╖рдг рдлрд╝рд╛рдЗрд▓ рдореЗрдВ jest.mock рдХреЙрд▓ рдХреА рдПрдХ рд▓рдВрдмреА рд╕реВрдЪреА

__ рдореИрдВ рдХреНрдпрд╛ рдХрд╣рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдБ__: рдХреБрдЫ рд░рд╛рд╕реНрддреЛрдВ рдкрд░ _auto mock_ рдореЙрдбреНрдпреВрд▓ рдХреА рдХреНрд╖рдорддрд╛ рд╣реЛрдирд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред

рдЗрд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдкреНрд░рд╕рд┐рджреНрдз рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рд╕рд░рдгреА-рдСрдл-рдЬреЗрд╕реНрдЯ-рдЧреНрд▓рдмреНрд╕ , рдФрд░ рдЙрд╕ рдкрд░ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдореЙрдбреНрдпреВрд▓ рдХреЗ рдЖрд╕рдкрд╛рд╕ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдореИрдВ рдЙрд╕ рдХрджрдо рдХрд╛ рд╡рд░реНрдгрди рдЪрд░рдгрдмрджреНрдз рддрд░реАрдХреЗ рд╕реЗ рдХрд░реВрдВрдЧрд╛

рдЗрд╕ рд╡рд┐рдиреНрдпрд╛рд╕ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП

"autoMockingPaths": [
  "src/components/dumb/**/*.js",
]

рдФрд░ рдпрд╣ рдХреЛрдб src/screens/app.js :

import _ from 'lodash';
import Button from '../../components/dumb/button.js';

// blah blah AppScreen implementation skipped

рдФрд░ рд╕реНрдХреНрд░реАрди рдкрд░ src/screens/__tests__/app-test.js рдХреЗ рд▓рд┐рдП рдпрд╣ рдкрд░реАрдХреНрд╖рдг рдХреЛрдб:

import AppScreen from '../app.js';

describe('AppScreen', () => /* testing app screen */);

рд╣рдо app-test.js рд╕рдВрджрд░реНрдн рдореЗрдВ рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЖрддреЗ рд╣реИрдВ:

  • AppScreen рдирдХрд▓реА рдирд╣реАрдВ рд╣реИ
  • lodash рдирдХрд▓реА рдирд╣реАрдВ рд╣реИ
  • Button , рдЬреЛ AppScreen рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдХрд╛ рдордЬрд╝рд╛рдХ рдЙрдбрд╝рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ

... рдЖрдк рдЬрд╡рд╛рдм рджреЗ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ automock config рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдЦреЗрд▓реЗрдЧрд╛?

рдмрд╕ рдХрд╣ рд░рд╣рд╛ рд╣реИ, automock: true рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ:

"autoMockingPaths": [
  "<rootDir>"
]

рдСрдЯреЛ рдореЙрдХрд┐рдВрдЧ ... рд░реБрдХреЛ!

рд╕рд┐рд░реНрдл automock рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рдореВрд▓реНрдп рдХрд╛ рдкрд░рд┐рдЪрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИ? рдХрдо рд╕реЗ рдХрдо рдпрд╣ рд▓реЛрдЧреЛрдВ рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдирд╣реАрдВ рддреЛрдбрд╝ рджреЗрдЧрд╛

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рд╡рд┐рдиреНрдпрд╛рд╕ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХреЗ рд╕рд╛рде:

automock: "app"

jest рд╕рднреА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЙрдбреНрдпреВрд▓реНрд╕ рдХреЛ рдСрдЯреЛ рдореЙрдХ рдХрд░реЗрдЧрд╛, рдФрд░ node_modules рд╕реЗ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдВрд╕реНрдХрд░рдг рдЫреЛрдбрд╝ рджреЗрдЧрд╛

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

рдореИрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ "haste_modules" рд╕реЗ рд╕рд╣рдордд рд╣реВрдВред

рд╣рдо рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдЙрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдпрд╣ рдирд╣реАрдВ рдХрд╣ рд╕рдХрддрд╛ рдХрд┐ рдХреНрдпрд╛ рдмреЗрд╣рддрд░ рд╣реИ, рдореЗрд░рд╛ рдЬрдВрдЧрд▓реА рдЕрдиреБрдорд╛рди рдпрд╣ рд╣реИ рдХрд┐ "autoMockingPaths" var рдЙрдкрдпреЛрдЧреА рдФрд░ рд▓реЛрдЪрджрд╛рд░ рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рдореБрдЭреЗ "automock": "app" рдмрд╣реБрдд рдХрдбрд╝реЗ рдорд┐рд▓рддреЗ рд╣реИрдВ ( jest рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЕрдХреНрд╖рдо рдСрдЯреЛрдореЛрдХрд┐рдВрдЧ)ред

__node_modules_mocks__ рдПрдХ рд╡рд┐рдХрд▓реНрдк рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рджреБрд░реНрд▓рднрддрд╛ рдХреБрд░реВрдкрддрд╛ рдХреЗ рд▓рд┐рдП рдХреНрд╖рддрд┐рдкреВрд░реНрддрд┐ рдХрд░рддреА рд╣реИ (рдореЗрд░реЗ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рд╢рд╛рдпрдж рд╣реА рдХрднреА node_modules рдирдХрд▓реА рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЬрдм рд╣рдореЗрдВ рдпрд╣ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ, рддреЛ рд╣рдо jest.mock(...) рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ
рдПрдХрдорд╛рддреНрд░ рдЪреЗрддрд╛рд╡рдиреА рдпрд╣ рд╣реИ: рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдЖрдкрдХреЗ рдкрд╛рд╕ рдиреЗрд╕реНрдЯреЗрдб node_modules рдлреЛрд▓реНрдбрд░ (рдЬреИрд╕реЗ src/node_modules ) рд╣реЛ, рдХреНрдпрд╛ рдЖрдкрдХреЛ рдЧреНрд▓реЛрдмрд▓ __node_modules_mocks__ , рдиреЗрд╕реНрдЯреЗрдб рд╡рд░реНрдЬрди рд╕реЗ рдЗрд╕рдХреЗ рдореЙрдбреНрдпреВрд▓реНрд╕ рдХрд╛ рдордЬрд╛рдХ рдЙрдбрд╝рд╛рдирд╛ рд╣реЛрдЧрд╛ рдпрд╣, рдпрд╛ рдЖрдо рддреМрд░ рдкрд░ __mocks__ рд╕рд╣-рд╕реНрдерд┐рдд рдХреЗ рд╕рд╛рде?

рдмрд╕ рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЕрдЧрд░ рдХрд┐рд╕реА рдХреЗ рдкрд╛рд╕ node_modules рдФрд░ app modules рдореЗрдВ рдПрдХ рд╣реА рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдирд╛рдо рд╣реЛ

рдЬреИрд╕реЗ

app/express.js рдРрдк рдореЙрдбреНрдпреВрд▓ рдХреЗ рд░реВрдк рдореЗрдВ
рдФрд░ npm рд╕реЗ рд╡реЗрдм рд╕рд░реНрд╡рд░ рдХреЗ рд░реВрдк рдореЗрдВ app/node_modules/express
throw new Error("can't mock express.js file - it duplicates one from node_modules")

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, __mocks__ рдХрд╛ рдЙрдкрдпреЛрдЧ node_modules рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рджреЗрд╡реЛрдВ рдХреЛ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЯрдХрд░рд╛рд╡реЛрдВ рдкрд░ рдЕрдкрдиреЗ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдирд╛рдо рдмрджрд▓рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ

рдирд╣реАрдВ ... рдпрд╣ __node_modules_mocks__ рд╕реЗ рдЕрдзрд┐рдХ рдмрджрд╕реВрд░рдд рд╣реИ, рд╣реИ рдирд╛?

рдореЗрд░рд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ: рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ npm install ed рдореЙрдбреНрдпреВрд▓ x рдФрд░ рдмрд╛рдж рдореЗрдВ, рдЖрдкрдХреЗ рдХреЛрдбрдмреЗрд╕ рдореЗрдВ рдЧрд╣рд░рд╛ рдПрдХ рдореЙрдбреНрдпреВрд▓ x рдиреЗрд╕реНрдЯреЗрдб node_modules рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ ?

рдирд╛рдордХрд░рдг рдЯрдХрд░рд╛рд╡ рдЖрдорддреМрд░ рдкрд░ рдирд┐рдХрдЯрддрдо рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреЗрдХрд░ рдиреЛрдб рдореЗрдВ рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдпрд╣ рдЬрд▓реНрджрдмрд╛рдЬреА рдореЗрдВ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдореИрдВ рдЗрд╕реЗ рдКрдкрд░ рд▓рд╛ рд░рд╣рд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ Create React App рдЬреИрд╕реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдпрд╛ рдирд┐рдХрдЯ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдХрд░реЗрдВрдЧреЗред

рдПрдХ рд╕рд╛рдЗрдб рдиреЛрдЯ рдкрд░, @cpojer рдпрд╣ рдореБрджреНрджрд╛ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ?

рдЖрдЗрдП рдЗрд╕реЗ рдмрджрд▓рдиреЗ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЬрд▓реНрджрдмрд╛рдЬреА рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИ (рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рд╢реНрд╡реЗрддрд╕реВрдЪреА / рдмреНрд▓реИрдХрд▓рд┐рд╕реНрдЯ)ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдмрдирд╛рдП рд░рдЦрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ <rootDir>/__mocks__ рдиреЛрдб рдореЙрдбреНрдпреВрд▓ рдореЛрдХреНрд╕ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рдо рдЗрд╕реЗ рдПрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╡рд┐рдХрд▓реНрдк рднреА рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ: "GlobalMocks" рдЬреЛ <rootDir>/__mocks__ рд▓рд┐рдП рдбрд┐рдлреЙрд▓реНрдЯ рдХрд░рддрд╛ рд╣реИред рдХреНрдпрд╛ рдХреЛрдИ рдЗрд╕ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреЛ рддреИрдпрд╛рд░ рд╣реИ?

рдореБрдЭреЗ рдЕрдЧрд▓реЗ рд╕рдкреНрддрд╛рд╣рд╛рдВрдд рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЬрд▓реНрдж рд╣реА рдЗрд╕ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдореИрдВ рдЗрд╕ рд░рд╡рд┐рд╡рд╛рд░ рдХреЛ рдкреАрдЖрд░ рдкрд░ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рдореИрдВ рдереЛрдбрд╝реЗ рд╕реНрд╡рддрдВрддреНрд░ рд╣реВрдВ

@cpojer рдХреЛ рдмрд╕ globalMocks рдХреЙрдиреНрдлрд┐рдЧ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ <rootDir>/__mocks__ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдХреЗ рд╕рд╛рде рдмрдирд╛рдПрдВред рдпрд╣ рд╡рд┐рдХрд▓реНрдк рдкрде рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдХреЗ jest рдХреЗ рднреАрддрд░ node-haste рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ? рдпрд╛ рдпрд╣ рдкрдереЛрдВ рдХреА рд╕рд░рдгреА рд╣реЛрдЧреА?

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд░рд╛рд╕реНрддреЗ рдореЗрдВ рдпреЗ рдХреБрдЫ рдмрдбрд╝реЗ рдмрджрд▓рд╛рд╡ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдПрдХрд╡рдЪрди GlobalMocks рд╡рд┐рдХрд▓реНрдк (рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХрд╛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдпрд╛ рд╕рд░рдгреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ) рдФрд░ hasteModules рд╡рд┐рдХрд▓реНрдк рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ haw рдореЙрдбреНрдпреВрд▓ рдХреЗ рдкрде рдХреА рдПрдХ рд╕рд░рдгреА рд╣реЛрдЧреАред рдЗрд╕ рдХреЛрдб рдХрд╛ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╣рд┐рд╕реНрд╕рд╛ jest-haste-map рдФрд░ jest-resolution рдореЗрдВ рд░рд╣рддрд╛ рд╣реИред рдореИрдВ 100% рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реВрдВ рдХрд┐ рд╕рд╣реА рд╕рдорд╛рдзрд╛рди рдЕрднреА рддрдХ рдХреИрд╕рд╛ рджрд┐рдЦреЗрдЧрд╛ред


рдкреНрд░реЗрд╖рдХ: рдореИрдХреНрд╕ рд╕рд┐рд╕реЛрдПрд╡ рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com
рдкреНрд░реЗрд╖рд┐рдд: рд╢реБрдХреНрд░рд╡рд╛рд░, 9 рджрд┐рд╕рдВрдмрд░, 2016 8:18:44 рдкреВрд░реНрд╡рд╛рд╣реНрди
To: рдлреЗрд╕рдмреБрдХ / рдЬреЗрд╕реНрдЯ
Cc: рдХреНрд░рд┐рд╕реНрдЯреЛрдлрд╝ рдкреЙрдЬрд╝рд░; рдЙрд▓реНрд▓реЗрдЦ
рд╡рд┐рд╖рдп: Re: [facebook / jest] [рдмрдЧ] рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдореИрдиреБрдЕрд▓ рдирдХрд▓реА рдЕрд▓рдЧ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдкрд╛рдпрд╛ (# 2070)

рдореИрдВ рдЗрд╕ рд░рд╡рд┐рд╡рд╛рд░ рдХреЛ рдкреАрдЖрд░ рдкрд░ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рдореИрдВ рдереЛрдбрд╝реЗ рд╕реНрд╡рддрдВрддреНрд░ рд╣реВрдВ

@cpojer https://github.com/cpojer рд╕рд┐рд░реНрдл рдкреБрдирд░реНрдХрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП - рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдХреЗ рд╕рд╛рде GlobalMocks рдХреЙрдиреНрдлрд╝рд┐рдЧ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдмрдирд╛рдПрдВ/ __ mocks__ред рдпрд╣ рд╡рд┐рдХрд▓реНрдк рдкрде рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдХреЗ рдХреАрдЯ рдХреЗ рднреАрддрд░ рдиреЛрдб-рдЬрд▓реНрджрдмрд╛рдЬреА рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ? рдпрд╛ рдпрд╣ рдкрдереЛрдВ рдХреА рд╕рд░рдгреА рд╣реЛрдЧреА?

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рд╕реАрдзреЗ рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рдЬрд╡рд╛рдм рджреЗрдВ, рдЗрд╕реЗ GitHub https://github.com/facebook/jest/issues/2070#issuecomment-265958606 рдкрд░ https://github.com/notifications/unubscribe-auth/AAA0KAMFc34iKqBDLHZGHGQGHGQGHGQGGQ3GGQGGQ3GGQGG3GGQ3G рдкрд░ рдИрдореЗрд▓

рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдореЗрд░рд╛ рд╡рд░реНрдХрд╕реНрдЯреЗрд╢рди рдЯреВрдЯ рдЧрдпрд╛, рдФрд░ рдЬрд╛рд╣рд┐рд░ рддреМрд░ рдкрд░ рдЗрд╕реЗ рдХреБрдЫ рдорд╣реАрдиреЛрдВ (1-2 рдорд╣реАрдиреЗ) рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рдорд┐рд▓рд╛ред рдореИрдВрдиреЗ рдЗрд╕ PR рдкрд░ рдЕрдкрдирд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рднреА рдЦреЛ рджрд┐рдпрд╛ рд╣реИ :( рдЗрд╕рд▓рд┐рдП, рдЬрд┐рдореНрдореЗрджрд╛рд░рд┐рдпрд╛рдБ рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд╖рдорд╛ рдХрд░реЗрдВред

getMockName рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рд░реНрдл рдПрдХ рд╡рд┐рдиреНрдпрд╛рд╕ рд╡рд┐рдХрд▓реНрдк рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?

рдЬреЗрд╕реНрдЯ рдХреЗ рдЗрдВрдЯрд░реНрдирд▓ рд╕реЗ рднреА рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдлрдмреА рдХреЗ рд▓рд┐рдП рдмрд┐рдирд╛ рдмреНрд░реЗрд╕реНрдЯ рдХреЗ рдорд╕рд▓реЗ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рд╕рд░рд▓ рдЙрдкрд╛рдп рд╣реИред

рдпрд╣ рдореВрд▓ рд░реВрдк рд╕реЗ рдореИрдВрдиреЗ рдЬрд┐рддрдирд╛ рд╕реЛрдЪрд╛ рдерд╛ рдЙрд╕рд╕реЗ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реЛрдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рдореЗрд░реЗ рд▓рд┐рдП, рдореИрдиреБрдЕрд▓ рдореЛрдХреНрд╕ рдХреЛ рд╡реЗ рдирд┐рдХрдЯрддрдо рдлрд╝рд╛рдЗрд▓ рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрд░реНрдерд╛рддред рдХреБрдЫ рдЗрд╕ рддрд░рд╣:

{ 'aws-sdk': '/Users/project/__mocks__/aws-sdk.js',
  'slack': '/Users/project/__mocks__/slack.js',
  '/Users/project/db/index': '/Users/project/db/__mocks__/index.js',
  '/Users/project/slack/index': '/Users/projects/slack/__mocks__/index.js' }

require('aws-sdk') рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рдзрд╛рди рд╣реЛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП /Users/project/__mocks__/aws-sdk.js рдпрд╣ рдПрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдХрд▓реА рд╣реИ node_module ред

require('./db') (рдпрд╛ db рд▓рд┐рдП рдХрд┐рд╕реА рднреА рдкрде) рдХреЛ рд╣рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП: /Users/project/db/__mocks__/index.js ред

рдЬреЗрд╕реНрдЯ рдореИрдиреБрдЕрд▓ рдореЙрдХ рдХреЛ рд╕реЗрдЯрдЕрдк рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореЗрд░реА рд╕рдордЭ (рдФрд░ рд╢рд╛рдпрдж рдЕрдзрд┐рдХ рдкреНрд░рд▓реЗрдЦрди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЕрдЧрд░ рдКрдкрд░ рдХреА рддрд░рд╣ рдХреБрдЫ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ) рдпрд╣ рдерд╛ рдХрд┐ рдЙрдиреНрд╣реЗрдВ __mocks__ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЗ рднреАрддрд░ рд╕рдВрднрд╡ рдХреЗ рд░реВрдк рдореЗрдВ рдореЙрдХ рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдХрд░реАрдм рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдореИрдиреБрдЕрд▓ рдореЛрдХреНрд╕ рдХреЛ __mocks рдореЗрдВ рдПрдХ рдореЙрдбреНрдпреВрд▓ рд▓рд┐рдЦрдХрд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ __ / рдЙрдкрдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рддреБрд░рдВрдд рдореЙрдбреНрдпреВрд▓ рд╕реЗ рд╕рдЯреЗред (https://facebook.github.io/jest/docs/manual-mocks.html)

рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП, рдЙрдкрд░реЛрдХреНрдд рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрд░реЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред

рд╡рд┐рдЪрд╛рд░?

рдпрд╣ рдЙрдкрд░реЛрдХреНрдд рдЬреИрд╕рд╛ рдХреБрдЫ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдкрд╛рд╕ рд╣реИ: https://github.com/facebook/jest/compare/master...mhahn : issue-2070-new-mock-resolution

рдпрд╣ рдЬреЗрд╕реНрдЯ рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рдмрд╣реБрдордд рдХреЛ рддреЛрдбрд╝рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЕрдм рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреА рддрд░рд╣ рд╢реБрджреНрдз "рдирд╛рдо" рдХреЗ рд▓рд┐рдП рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ: https://github.com/facebook/jest/blob/master/packages/jest-runtime/src/__mocks__/ createRuntime.js

IMO, createRuntime рдЬреИрд╕рд╛ рдХреБрдЫ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдЙрдкрдпреЛрдЧрд┐рддрд╛ рд╣реИ рдЬреЛ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдмрд░реНрддрди рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдЖрдпрд╛рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдпрд╣ рдПрдХ рдореИрдиреБрдЕрд▓ рдореЙрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╡рд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореЗрд░реЗ рд▓рд┐рдП рдХреБрдЫ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдПрдХ рд╡рд┐рдХрд▓реНрдк рдПрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдЪрд░ рдЬреЛрдбрд╝рдирд╛ рд╣реИ рдЬреЛ рдореМрдЬреВрджрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рдмреАрдЪ рд╕реНрд╡рд┐рдЪ рдХрд░реЗрдЧрд╛ рдФрд░ рдЙрдкрд░реЛрдХреНрдд рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд╕рд╛рдл рдХрд░реЗрдЧрд╛ред рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реВрдБ рдХрд┐ рдХреНрдпрд╛ рдХрд╣рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╣рдо рд╡рд░реНрддрдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рддреЛрдбрд╝ рдирд╣реАрдВ рд╕рдХрддреЗ рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдлреЗрд╕рдмреБрдХ рдкрд░ рдмрд╣реБрдд рдЕрдзрд┐рдХ рднрд░реЛрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВред

@ cpojer рдореИрдВ рд╕рд╣рдордд рд╣реВрдБред рдореИрдВрдиреЗ рдХреЛрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рдЯрд┐рдкреНрдкрдгреА рдХреЛ рдирд╣реАрдВ рд╕рдордЭрд╛: https://github.com/facebook/jest/issues/2070#issuecomment -265027510ред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЙрди рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдХреА рд╕реВрдЪреА рдХреЛ рд╢реНрд╡реЗрддрд╕реВрдЪреА рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╡рд░реНрддрдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░реЗрдВрдЧреЗ?

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

  • fullPathMockResolution (рдореМрдЬреВрджрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП false рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ)
    рдХреЗ рд╕рд╛рде рдорд┐рд▓рдХрд░:
  • namedMockDirectories : рдпрджрд┐ fullPathMockResolution рд╕рдХреНрд╖рдо рд╣реИ, рддреЛ рдЙрд╕ рд╕рд░рдгреА рдХреЗ рднреАрддрд░ рдХреЛрдИ рднреА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореМрдЬреВрджрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд╕рд╛рде рд╣рд▓ рд╣реЛ рдЬрд╛рдПрдЧреАред рдПрдлрдмреА рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рд╕рд┐рд░реНрдл [<rootDir>] рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рддреЗ рд╣реИрдВред

рдЗрд╕рд╕реЗ рджреЗрд╡реЛрдВ рдХреЛ рдкреВрд░реНрдг рдкрде рд╕рдВрдХрд▓реНрдк рдореЗрдВ рдЪрдпрди рдХрд░рдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдорд┐рд▓рддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдореМрдЬреВрджрд╛ рдЬреЗрд╕реНрдЯ рдЗрдВрд╕реНрдЯреЙрд▓ рджреНрд╡рд╛рд░рд╛ рдмрджрд▓рд╛рд╡ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ рдФрд░ рдпрджрд┐ рд╡реЗ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдореМрдЬреВрджрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рднреА рд╕рдХреНрд╖рдо рдмрдирд╛рддрд╛ рд╣реИред

cc @voideanvalue рдпрд╣ рдХреБрдЫ рдРрд╕рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдкрдХреЛ рд╕реЛрдЪрдирд╛ рд╣реЛрдЧрд╛ (рдирдП рдирд╛рдорд╛рд╡рд▓реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рднрд╛рдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдирд╛рдо рд╕реНрдерд╛рди рдореИрдиреБрдЕрд▓)ред

+1, рдХреНрдпрд╛ рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИ?

+1

рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рдЕрдкрдбреЗрдЯ? рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рджрд░реНрджрдирд╛рдХ рд╣реИ:

project/
тФЬтФАтФА models
тФВ   тФЬтФАтФА index.js
тФВ   тФЬтФАтФА __mocks__/
тФВ   тФВ   тФЬтФАтФА index.js/
тФЬтФАтФА challenges
тФВ   тФЬтФАтФА index.js
тФВ   тФЬтФАтФА __mocks__/
тФВ   тФВ   тФЬтФАтФА index.js/

рдЕрднреА рдореБрдЭреЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдПрдХ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдордЬрд╝рд╛рдХ рдЙрдбрд╝рд╛рдирд╛ рд╣реИ рдЕрдЧрд░ рдореИрдВ рджреЛ 'рдкрд░рд╕реНрдкрд░ рд╡рд┐рд░реЛрдзреА' рдирд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рднрд▓реЗ рд╣реА рдЙрдирдХреЗ рдкрд╛рд╕ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд░рд╕реНрдкрд░ рд╡рд┐рд░реЛрдзреА рдирд╛рдо рди рд╣реЛрдВ рдХреНрдпреЛрдВрдХрд┐ рдкрде рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЪреАрдпрд░реНрд╕,
рдбреЛрдорд┐рдирд┐рдХ

@cpojer рджреЛрд╕реНрддреЛрдВ рдпрд╣рд╛рдБ рдХреЛрдИ рдЕрдкрдбреЗрдЯ? рдХреНрдпрд╛ рдЖрд╕рдкрд╛рд╕ рдХреЛрдИ рдХрд╛рдо рд╣реИ?

рдореЗрд░реЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рд╕рд╛ рдХрд╛рдо рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╕реЗ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдордЬрд╛рдХ рдЙрдбрд╝рд╛рдирд╛ рд╣реИ

jest.mock('models/index', () => require('models/index/_mocks_/index'));

рдореИрдВрдиреЗ __mocks__ рдлрд╝реЛрд▓реНрдбрд░ рдХрд╛ рдирд╛рдо _mocks_ рддрд╛рдХрд┐ jest рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдкрдХрдбрд╝ рди рд╕рдХреЗред

рдПрдХ рджрд┐рди рдЬрдм рдпрд╣ рдХрд╛рдо рдХрд░реЗрдЧрд╛ рддреЛ рдореИрдВ _mocks_ рд╕реЗ __mocks__ рдХрд╛ рдирд╛рдо рдмрджрд▓ рджреВрдВрдЧрд╛ рдФрд░ jest.mock рд╕реЗ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╡рд╛рд▓реЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рд╣рдЯрд╛ рджреВрдВрдЧрд╛

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ: рд╕рднреА рднрдпрд╛рдирдХ рдХрд╛рдо рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред
рджреВрд╕рд░реА рдмрд╛рдд: рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд╛рдлреА рдирд┐рд░рд╛рд╢рд╛рдЬрдирдХ рд╣реИред рдореИрдВ рдЕрдкрдиреЗ рдЖрдк рдХреЛ рдкрд░реАрдХреНрд╖рдг рдлрд╝рд╛рдЗрд▓ рдореЗрдВ jest.mock рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рддрд╛ рд╣реВрдВ рдЬрдм рдирдХрд▓реА рдлрд╝рд╛рдЗрд▓ рдкреВрд░реЗ рдХреЛрдбрдмреЗрд╕ рдореЗрдВ рдХрд┐рд╕реА рдЕрдиреНрдп рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕рд╛рде рдПрдХ рдирд╛рдо рд╕рд╛рдЭрд╛ рдХрд░рддреА рд╣реИ рдЬреЛ рднреА рдирдХрд▓реА рд╣реЛ рдЬрд╛рддреА рд╣реИред рдЙрддреНрдерд╛рдкрди рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдореЙрдХ рдХреЛ рднреА рдЖрдпрд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рджреЗрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЖрдкрдХреЛ рдХрд┐рд╕реА рднреА рджреЛ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рдирдХрд▓реА рдХреА рдирдХрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдкрд░реАрдХреНрд╖рдг рд╕реВрдЯ рдХреА рдирд╛рдЬреБрдХрддрд╛ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реБрдП, рдЙрд╕ рдлрд╛рдЗрд▓ рдХреЛ рдирдХрд▓реА рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдХреНрдпрд╛ рд╣рдо рдЗрд╕реЗ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ? рдХреНрдпрд╛ рдПрдлрдмреА рдЗрд╕ рд╕рд╛рдорд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ? рдпрджрд┐ рд╣рд╛рдБ, рддреЛ рдХреИрд╕реЗ? ЁЯШЮ

+1 рдЗрди рдЪреЗрддрд╛рд╡рдирд┐рдпреЛрдВ рдХреЛ рджреЗрдЦрдХрд░ рдмрд╣реБрдд рдирд┐рд░рд╛рд╢рд╛ рд╣реБрдИред рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрддрдЬрд╛рд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдЬреЛ рд╕рдорд╕реНрдпрд╛ рд╣реИ рд╡рд╣ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ:

рдЕрдЧрд░ рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ jest.mock ('src / utils / history') рд╣реИ, рддреЛ рдпрд╣ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ 'history' node_module рдХрд╛ рднреА рдордЬрд╛рдХ рдЙрдбрд╝рд╛рддрд╛ рд╣реИред

https://github.com/cwmoo740/jest-manual-mocks-node-modules

рдХрд┐рд╕реА рднреА рдЕрджреНрдпрддрди?

@masoudcs рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдЪреЗрддрд╛рд╡рдиреА рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдорд┐рд▓рд╛:

package.json

"jest": {
  /* other settings ... */
  "modulePathIgnorePatterns": ["<rootDir>/node_modules/react-native/Libraries/Core/__mocks__"]
}

modulePathIgnorePatterns рд╕рд░рдгреА рдореЗрдВ "рдбреБрдкреНрд▓рд┐рдХреЗрдЯ" рдлрд╝реЛрд▓реНрдбрд░ рдЬреЛрдбрд╝реЗрдВ рдФрд░ рдЪреЗрддрд╛рд╡рдиреА рдЪрд▓реА рдЬрд╛рдПрдЧреА

рдзрдиреНрдпрд╡рд╛рдж @brunolm

рддреЛ рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рдЪреЗрддрд╛рд╡рдиреА рд╣реИ, рд╕рд╣реА рд╣реИ ?!
рдореИрдВ рд╕рд┐рд░реНрдл рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдЗрд╕рд╕реЗ рдХреБрдЫ рдмреБрд░рд╛ рди рд╣реЛ, рдпрд╛рдиреА рдХрдИ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдореЗрдВ index.js рдХрд╛ рдордЬрд╝рд╛рдХ рдЙрдбрд╝рд╛рдпрд╛:
src/app/modules/module1/__mocks__/index.js рдФрд░ src/app/modules/module2/__mocks__/index.js

рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдм рдореИрдВ рдЗрд╕реЗ рдЪрд▓рд╛ рд░рд╣рд╛ рдерд╛ рддреЛ рдпрд╣ рдХрд╣ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рджреВрд╕рд░реЗ рдХреЛ рд╣реА рд▓реЗрдЧрд╛ рдФрд░ рдпрд╣ рдХрд┐ рдореИрдВрдиреЗ рд╕реВрдЪреАрдмрджреНрдз рдХрд┐рдпрд╛ рд╣реИ рдпрд╛ рддреЛ рдЗрд╕реЗ рдЕрдирджреЗрдЦрд╛ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдЕрдирджреЗрдЦрд╛ рдХрд░рдирд╛ рдареАрдХ рд╣реИ, рдпрд╣ рд╡реИрд╕реЗ рднреА рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рдерд╛ред

рд╣рд╛рдВ, рдЬреИрд╕рд╛ рдЖрдкрдиреЗ рдХрд╣рд╛, рдФрд░ рд╣рдордиреЗ рдЕрдм рддрдХ рдХрд┐рд╕реА рднреА рдореБрджреНрджреЗ рдХрд╛ рд╕рд╛рдордирд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ред
рдЙрдореНрдореАрдж рд╣реИ, рдпрд╣ рд╡рд╣реА рдХрд░ рд░рд╣рд╛ рд╣реИ рдЬреЛ рдЗрд╕реЗ рдХрд░рдирд╛ рд╣реИ! :)
рдзрдиреНрдпрд╡рд╛рдж

рдореИрдВрдиреЗ рдХреЛрд╢рд┐рд╢ рдХреА рдХрд┐ рдпрд╣ рдЖрдЦрд┐рд░реА рджреЛ рдХреНрдпрд╛ рд╕реБрдЭрд╛рдП рдЧрдП рд▓реЗрдХрд┐рди рдЪреЗрддрд╛рд╡рдиреА рдХреЛ рдирд╣реАрдВ рд╣рдЯрд╛рдпрд╛ред

jest.mock('dir/index', () => require('dir/__mocks_/index'));

рдореИрдВ рдпрд╣ рдЪреЗрддрд╛рд╡рдиреА рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ GitBook ( ./_book рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рднрд▓реЗ рд╣реА рдореЗрд░реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ testPathIgnorePatterns: ['/_book/', ...otherStuff] рд╣реЛред рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реНрдХрд┐рдорд┐рдВрдЧ, рдореБрдЭреЗ рд╕реНрдкрд╖реНрдЯ рдХрдЯреМрддреА рдирд╣реАрдВ рджрд┐рдЦрддреА рд╣реИред рдореИрдВ рд╕рд┐рд░реНрдл рдЪреЗрддрд╛рд╡рдиреА рджреЗрдЦрдирд╛ рдмрдВрдж рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ - рдХрд┐рд╕реА рднреА рдорджрдж рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХреА рдЬрд╛рдПрдЧреАред

+1

рдЗрд╕ рдкрд░ рдХрд┐рд╕реА рднреА рдЕрджреНрдпрддрди?

рдЕрднреА рднреА рдПрдХ рдареАрдХ рдХреА рддрд▓рд╛рд╢ рдореЗрдВ рд╣реИ рддрд╛рдХрд┐ рдореЗрд░реА рдкрд░реАрдХреНрд╖рдг рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдПрдХ рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рдлреИрд╢рди рдореЗрдВ рд░рдЦрд╛ рдЬрд╛ рд╕рдХреЗ, рди рдХрд┐ рдЕрдзрд┐рдХ рдЧрдВрджреЗ рддрд░реАрдХреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЬреЛ рдХрд┐ рдКрдкрд░ рд╕реБрдЭрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред

jest.mock('models/index', () => require('models/index/_mocks_/index'));

рд╣рдорд╛рд░реА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕рдВрд░рдЪрдирд╛ @dkundel рдХреЗ рд╕рдиреНрджрд░реНрдн рдХреЗ рд╕рдорд╛рди рд╣реА рджрд┐рдЦрддреА рд╣реИ рдпрд╣рд╛рдБ https://github.com/facebook/jest/issues/2070#issuecomment -301332202 index.js рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдирд╛рдорд╕реНрдерд╛рдиреЛрдВ рдореЗрдВ рдореЙрдбрд▓ рдФрд░ рдШрдЯрдХреЛрдВ рдХреЗ рд╕рд╛рде рд╣реИред рдирд┐рд░реНрдпрд╛рддред

рдЪреЗрддрд╛рд╡рдирд┐рдпреЛрдВ рдХреЛ рдЪреБрдк рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ рдпрд╛ рд╕рднреА рдореЛрдЬрд╝реЛрдВ рдХреЛ рдПрдХ рдлреНрд▓реИрдЯ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ рдирд╣реАрдВ рдлреЗрдВрдХрдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗред рд╣рдорд╛рд░реЗ рдореЛрдХреНрд╕ рдореЗрдВ рд╕реЗ рдХреБрдЫ рдЧрд╣рд░рд╛рдИ рд╕реЗ рдиреЗрд╕реНрдЯреЗрдб рд╣реИрдВ, рдФрд░ рд╕реБрдЭрд╛рдП рдЧрдП рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХреА рддрд░рд╣ рджрд┐рдЦрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ
jest.mock('pages/index/components/Component', () => require('pages/index/components/Component/_mocks_/index'));
рд╣рдорд╛рд░реА рд╕рдВрд░рдЪрдирд╛ рдореЗрдВред

рдХреЛрдИ рднреА рд╢рдмреНрдж?

@karomancer рдореИрдВрдиреЗ PR # 6037 рдЬрдорд╛ рдХрд┐рдпрд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдЪреЗрддрд╛рд╡рдирд┐рдпреЛрдВ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред рдЕрднреА рддрдХ, рдЗрд╕рдХрд╛ рд╡рд┐рд▓рдп рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ; рдореИрдВ рдпреЛрдЧрджрд╛рдирдХрд░реНрддрд╛рдУрдВ рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

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

package.json

{
  "jest": {
    "setupFiles": [
      "<rootDir>/test.mocks.ts"
    ]
  }
}
/* test.mocks.ts */

// modules mocked before every test
// use `jest.unmock(...)` to undo for any single test case
const mockedModules = [
    "./path/to/module1/index.ts",
    "./path/to/module2/index.ts",
];

mockedModules.forEach((path) => {
    const mockPath = path.replace(/\.ts$/g, ".mock.ts");
    jest.mock(path, () => require(mockPath));
});

рдпрд╣ рдЖрдкрдХрд╛ рдЙрдкрд╣рд╛рд╕ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ anything.ts рдПрдХ рднрд╛рдИ рдмрдирд╛рдХрд░ anything.mock.ts рдФрд░ рд╢реАрд░реНрд╖ рд╕реНрддрд░ рдореЗрдВ рдореВрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрде рдХреЛ рдЬреЛрдбрд╝рдиреЗ test.mocks рдХреЗ mockedModules рд╕рд░рдгреАред

рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╡реГрджреНрдзрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдХреНрдпреЛрдВ рдЯреИрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛?

рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рдиреЗ рд▓рдЧрддрд╛ рд╣реИред jest.config.js рдореЗрдВ:

module.exports = {
  // ...
  modulePathIgnorePatterns: ["<rootDir>/.*/__mocks__"]
};

рдореИрдВ рдЗрд╕ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рджрд╛рдпрд░реЗ рдпрд╛ рдкреНрд░рднрд╛рд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдЫреЛрдЯреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╣реИред

@amccloud рдзрдиреНрдпрд╡рд╛рдж! рдЗрд╕рд╕реЗ рдореЗрд░реА рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рд╣реЛ рдЧрдИ! рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рд╡рд┐рд╡рд░рдгред

рдореЗрд░реЗ рдкрд╛рд╕ рдореЗрд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рд░реВрдЯ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ рдПрдХ рдореЙрдбреНрдпреВрд▓ helpers рд╣реИред рд╕рд╣рд╛рдпрдХ parseNodeFromString рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдирд┐рд░реНрдпрд╛рдд рдХрд░ рд░рд╣рд╛ рд╣реИред
рдореИрдВрдиреЗ рдХреБрдЫ рдЕрдиреНрдп рдореЙрдбреНрдпреВрд▓ рд╕реНрдерд╛рдиреАрдп рдлрд╝рд╛рдЗрд▓ helpers рдореЗрдВ рдмрдирд╛рдИ рд╣реИред рдлрд┐рд░ рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдордЬрд╛рдХ рдЙрдбрд╝рд╛рдпрд╛ред рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рд╕рднреА рдкрд░реАрдХреНрд╖рдг parseNodeFromString рдирд┐рдореНрди рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рд╡рд┐рдлрд▓ рд╣реЛрдиреЗ рд▓рдЧреЗ:

FAIL  src/some_dir/bla/tests/SomeClass.test.js
  тЧП Test suite failed to run

    TypeError: (0 , _helpers.parseNodeFromString) is not a function

рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛? @Amccloud рд╕рдорд╛рдзрд╛рди рдХреА рддрд░рд╣ рд╕рд╣реА рд╣реИред

modulePathIgnorePatterns: ["<rootDir>/.*/__mocks__"]

рдпрд╣ рд╕рдорд╛рдзрд╛рди рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕рдиреЗ рдиреЛрдб рдореЙрдбреНрдпреВрд▓реНрд╕ рдХреЗ рд▓рд┐рдП рдореЗрд░реЗ рд╢реАрд░реНрд╖ рд╕реНрддрд░ рдХреЗ рдореЛрдХреНрд╕ рдХреЛ рд╡рд┐рдлрд▓ рдХрд░ рджрд┐рдпрд╛ред рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕реЗ рдЕрдкрдиреЗ рд░реВрдЯ __mock__ рдлрд╝реЛрд▓реНрдбрд░ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрджрд▓ рджрд┐рдпрд╛: "modulePathIgnorePatterns": ["<rootDir>/src/react/.*/__mocks__"], ред рдЕрднреА рднреА рдпрд╣ рдХрд╛рдлреА рдЕрдЬреАрдм рд╣реИ рдХрд┐ рдореВрд▓ рд╕реЗ рдкреВрд░реНрдг рдкрде рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдирдХрд▓реА рдХреЗрд╡рд▓ рдЕрджреНрд╡рд┐рддреАрдп рдирд╣реАрдВ рд╣реИрдВред рдпрд╣ рдмрд╣реБрдд рдЖрдо рд╣реИ: users/helper.js рдФрд░ posts/helper.js ред рдЪреЗрддрд╛рд╡рдиреА рдореЗрдВ рдХреБрдЫ рдЬрдЧрд╣ рд╣реИ, рдФрд░ рдореИрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЪреЗрддрд╛рд╡рдиреА рдЫрд┐рдкрд╛рдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ред

рддреЛ рдкреАрдЖрд░ рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХреНрдпрд╛ рд╣реИ? рдХреНрдпрд╛ рдХреЛрдИ рдЙрдЪрд┐рдд рд╕рдорд╛рдзрд╛рди рд╣реИ рдпрд╛ рд╕рд┐рд░реНрдл рдХреБрдЫ рд╣реИрдХреНрд╕?

рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рд░ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд╕рд╛рде Dist dir рдореЗрдВ рдирдХрд▓реА рдореЙрдбреНрдпреВрд▓ рдХреА рдирдХрд▓ рдХреА рдЧрдИ рдереАред

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рд╕рдорд╕реНрдпрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЧрд╣рд░реЗ рд░рдВрдЧ рдХреА рд╕рдВрд░рдЪрдирд╛ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдкрде / рдкреИрдЯрд░реНрди рдХреЛ рдмрд╛рд╣рд░ рдХрд░рдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрде рд╣реИред рдпрд╣ рдЕрднреА рднреА "typecript@^3.4.5" рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИред

рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рд╣рд░ рдЯреЗрд╕реНрдЯ рд░рди рд╕реЗ рдкрд╣рд▓реЗ рдЕрдкрдиреЗ рдбрд┐рдо рдбрд╛рдпрд░ рдХреЛ "рд░рд┐рдорд░рдл рдбрд┐рд╕реНрдЯ" рд╕реЗ рд╕рд╛рдл рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ред

"test:unit": "npm run clean && stencil test --spec --snapshot",

рдореБрдЭреЗ рдЗрд╕рдХреА рд╣реИрдХ рдкрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдЕрд░реЗ рдореИрдВрдиреЗ рдЗрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рд╣реИ рдЬреЛ рд╣реБрдЖ рд╣реИ, рдФрд░ рд╢рд╛рдпрдж рдпрд╣ рдЖрдкрдХреА рдирдХрд▓ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рддреАрди рд╕рдорд╛рдзрд╛рди рдпрд╛ рдкрд░рд┐рджреГрд╢реНрдп:

1, рдореИрдВ рдЕрдкрдиреЗ рдЯреЗрдХреНрд╕реНрдЯ рдПрдбрд┐рдЯрд░ рдкрд░ рдЕрдкрдиреЗ рдРрдк рдХреЛ рджреЛ рдмрд╛рд░ рдПрдбрд┐рдЯ рдХрд░ рд░рд╣рд╛ рдерд╛, рдореИрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡рд┐рдВрдбреЛ рд╕реЗ рдкреЙрдб рдЗрдиреНрд╕реНрдЯреЙрд▓ / рдЕрдкрдбреЗрдЯ рдФрд░ рд░рд┐рдПрдХреНрд╢рди-рд░рди-рдЖрдИрдУрдПрд╕ рдЪрд▓рд╛ рд░рд╣рд╛ рдерд╛ред рдФрд░ рдореБрдЭреЗ рдпрд╣ рддреНрд░реБрдЯрд┐ рдорд┐рд▓реА, рдореИрдВрдиреЗ Xcode рдореЗрдВ рдФрд░ рдЕрдкрдиреЗ рдРрдк рдкрд░ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рдЦреЛрдЬ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдХреЛрдИ рдирд╣реАрдВ рдорд┐рд▓рд╛ред рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдмрд╕ рд╕рд┐рдореНрдпреБрд▓реЗрдЯрд░ рд╕реЗ рдРрдк рдХреЛ рдбрд┐рд▓реАрдЯ рдХрд┐рдпрд╛ рдФрд░ рд░рд┐рдПрдХреНрдЯ-рджреЗрд╢реА рд░рди-рдЖрдИрдУрдПрд╕ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЪрд▓рд╛рдпрд╛ рдФрд░ рдпрд╣ рдХрд╛рдо рдХрд┐рдпрд╛, рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рджреЛ рдиреЛрдб_рдореЙрдбреНрдпреВрд▓реНрд╕ рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛: рдиреЛрдб_рдореЙрдбреНрдпреВрд▓ рдФрд░ рдиреЛрдбреНрд╕_рдореЙрдбреНрдпреВрд▓реНрд╕ 0 рдореЗрд░реА рд╕реНрдХреНрд░реВ рдлрд╝рд╛рдЗрд▓ рдореЗрдВред

2, рдХрднреА-рдХрднреА рдЬрдм рдореИрдВ рдЕрдкрдиреЗ рдореИрдХ рдкрд░ рд░реИрдВрдбрдо рдХреАрдЬ рджрдмрд╛рддрд╛ рд╣реВрдВ рддреЛ рдиреЛрдб_рдореЙрдбрд▓реНрд╕ рдХреЛ рдПрд╕рдЖрд░рд╕реА рдлреЛрд▓реНрдбрд░ рдХреЗ рд▓рд┐рдП рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рднреА рдорд╛рдорд▓рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдХрд┐рд╕реА рднреА рдиреЛрдб_рдореЙрдбреНрдпреВрд▓реНрд╕ рдбреБрдкреНрд▓реАрдХреЗрд╢рдВрд╕ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЗ рдлреЛрд▓реНрдбрд░ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рд░рдЦрдирд╛ рд╣реИред

3, рдореИрдВ рдЕрдкрдирд╛ рдРрдк рддрдм рддрдХ рд╢реБрд░реВ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рдЬрдм рддрдХ рдореИрдВрдиреЗ рд▓реЙрдиреНрдЪ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдФрд░ рдПрдХ рд╣реА рд╕рд┐рдореНрдпреБрд▓реЗрдЯрд░ рдкрд░ рдПрдХ рдЕрд▓рдЧ рдРрдк рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░ рджрд┐рдпрд╛ рдФрд░ рдлрд┐рд░ рдореИрдВрдиреЗ рдРрдк рдХреЛ рджреЛрд╣рд░рд╛рд╡ рдХреЗ рд╕рд╛рде рд░рд┐рдмреВрдЯ рдХрд┐рдпрд╛, рдЬреЛ рддрдм рдмрд┐рдирд╛ рдХрд┐рд╕реА рддреНрд░реБрдЯрд┐ рдХреЗ рдирд┐рдХрд╛рд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдЕрдм рддрдХ рдХреБрдЫ рднреА рдирд╣реАрдВ? рдХреИрдВрдЯ CRA рдореЗрдВ рдореЙрдбреНрдпреВрд▓рдкреИрдердЗрдЧреНрдиреЛрд░рдЯреИрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ

3 рд╕рд╛рд▓ рдФрд░ 10 рдорд╣реАрдиреЗ

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

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

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

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

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

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

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

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