æ©èœããªã¯ãšã¹ãããã°ãå ±åããŸããïŒ ãã°
çŸåšã®åäœã¯äœã§ããïŒ
äžãããããã¡ã€ã«ããªãŒïŒ
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
ãäœæãããšã jest-haste-map
ããduplicate manual mock found
ãšã©ãŒãçºçããŸãã
ãã ãã src/app/modules/__mocks__/{module1.js,module2.js}
ãäœæããããšãããšãã¢ãã¯ããããã¡ã€ã«ã¯äœ¿çšãããŸããã
çŸåšã®åäœããã°ã§ããå Žåã¯ãåçŸããæé ãšãå¯èœã§ããã°GitHubã«npm install
ãšnpm test
æå°éã®ãªããžããªãæäŸããŠãã ããã
äžèšã®åäœãåç §ããŠãã ããã
æåŸ ãããåäœã¯äœã§ããïŒ
æåã®ã±ãŒã¹ãç°ãªããã¹ã䜿çšãã2çªç®ã®ã±ãŒã¹ãã¢ãžã¥ãŒã«ã®ãã¹åã䜿çšããããšãèãããšãã©ã¡ãã®ã¢ãããŒããæ©èœããããšãæåŸ ããŸãã
--debug
ã䜿çšããŠJestãå床å®è¡ããå°å·ããå®å
šãªæ§æãæäŸããŸãã
ããŒã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
+1
ç§ã®å Žåã cacheDirectory
/ var / folder / dm / vt920lmd6tzdq_709zkykwx40000gn / T / jestãã¯ãªã¢ããnpmã®äŸåé¢ä¿ãåã€ã³ã¹ããŒã«ãããšããããã®ã¡ãã»ãŒãžã¯è¡šç€ºãããªããªããŸããã
åé¡ã®ããã³ãŒãã¯æ¬¡ã®ãšããã§ãã
ããããããã確èªãããã¹ãããããããåäœãæ瀺çã«å¿ èŠãšãããå¯èœæ§ãããããã§ãã
è¿œå ããããã®ïŒ
https://github.com/facebook/jest/commit/cfade282fbbe2737b6dd2cee1cf3da3ee8624512
ãã¹å
šäœã§ã¯ãªãbasename
ããŒãšããŠäœ¿çšããŠããã®ã¯ãªãã§ããïŒ
/ cc @flarnie
ã€ãŸããæåã¢ãã¯ã䜿çšããå Žåãã¢ãžã¥ãŒã«ã®basename
ã¯ããããžã§ã¯ãå
ã§ã°ããŒãã«ã«äžæã§ããå¿
èŠããããŸãã ç§ã®ãŠãŒã¹ã±ãŒã¹ã§ã¯ã次ã®ãããªããšãã§ããªãããšãæå³ããŸãã
import { MyWhatever } from 'models/MyWhatever/schema';
import { MyOtherWhatever } from 'models/MyOtherWhatever/schema';
åæã«æåã¢ãã¯ã䜿çšããŸãã Jestã¯çŸåšãããããschema
ãå²ç¬ããŠãããšèŠãªããæå¥ãèšããŸãã
åé¿çã¯ç°¡åã§ããïŒs / schema / MyWhateverSchema /ïŒããã¹ã以å€ã®ã³ãŒãã®ååãå€æŽããŠåæ§ç¯ããåè«ãåã°ããã®ã¯ãã°ã®ããã§ãðã
ã¯ããããã¯ç¢ºãã«ã²ã©ãã§ãã æåã¢ãã¯ã·ã¹ãã ã¯æ¬åœã«è¯ããããŸããããããŠç§ãã¡ããã¹ãŠã®FBãå£ããªãããšã確å®ã«ããããšãã§ãããšä»®å®ããŠãç¶æ³ãæ¹åããPRãåãå ¥ããŠããããã§ãïŒãããç§ã¯ãããäžè©±ããããšãã§ããŸã:)ïŒ
涌ããã ææ¥ã¯ããããäœæããæéãèŠã€ãããããããŸããããçŽæã¯ãããŸããð
@cpojerãã®åäœã«ã¯ç¹å¥ãªçç±ããããŸããïŒ
fbãã¢ãžã¥ãŒã«ã«äžæã®ãã¡ã€ã«åã䜿çšããŠãããšããäºå®ãšé¢ä¿ããããŸããïŒ åãååã®2ã€ã®ã¢ãã¯ãèš±å¯ããªãããšãã©ã®ããã«æå³ãããã®ãââä»ã®æ¹æ³ã§ã¯ããããŸãã...
ã¯ããã¢ãã¯ããã°ããŒãã«ãã§ãã æ®å¿µãªãããããã¯ç§ãã¡ãäžç·ã«æ®ãããªããã°ãªããªãã²ã©ããã¶ã€ã³ã§ãã FBã§ã¯4000以äžã®ã¢ãã¯ãã¡ã€ã«ãééã£ãå Žæã«ãããŸãïŒãããŠå€ãã®å Žåãé©åãªå ŽæãããããŸããïŒã ããã¯æ¬¡ã®ååã®æ©ã段éã§ä¿®æ£ãããå¯èœæ§ãé«ããããJestã§ã¯æ¹åãããã¯ãã§ãã ãªãŒãã³ãœãŒã¹åãã®Jestã®åäœãæ¹åããPRããµããŒãã§ããããšãããããæããŸããä»ã®ãšãããFBã§ã®Jestã®å€ãåäœãç¶æã§ããã°ã
@cpojeræã¯ã©ãã§ããïŒ ãã©ã°ã§ãããæå¹/ç¡å¹ã«ããPRãåãå ¥ããŸããïŒ
ãããããã¯èšå®ãªãã·ã§ã³ã§ãªããã°ãªããŸããã ããããç§ã¯èŠåã«ã€ããŠè©±ããŠããã ãã§ãªããæ©èœå šè¬ã«ã€ããŠã話ããŠããã®ã§ãã
@cpojer right-ããã¯åè«ã®ã©ã®éšåã«è§ŠããŸããïŒ
解決ã³ãŒãã¯jest-runtimeããåŒã³åºãããŸãïŒ https ïŒ
@cpojerãã€ã³ã¿ãããããšãïŒ+1ïŒ
@cpojerãã®åäœãåãæ¿ããããã®JEST_USE_BASENAME_FOR_CACHING
ãªã©ã®ã°ããŒãã«ãªãŒããŒã©ã€ãã¯ã©ãã§ããïŒ
å°ãªããšããäžæã§ãªããã¡ã€ã«åã楜ããããšãã§ããFBã§ã¯äœãå£ããŸããã
ãã¡ãããããã¯äžæçãªè§£æ±ºçã§ãã
ã€ãŸããããã¯ããã€ãã®/etc/profile
ãŸãã¯~/.bashrc
export JEST_USE_BASENAME_FOR_CACHING="true"
ïŒãŸãã¯envãå«ããã¡ã€ã«ïŒ
ãã®åŸ
$ jest
ãŸãã¯ãããenvãã¡ã€ã«ã®å€æŽãªãïŒ
$ JEST_USE_BASENAME_FOR_CACHING="true" jest
ããªããæãããšïŒ ããã¯äžçš®ã®ããã¯ã§ããããããšã倧äžå€«ã§ããïŒ ïŒãŠã£ã³ã¯ïŒ
2ã€ã®ããŒãžã§ã³ã®jestïŒ ^15.0.0
ãš^17.0.0
ïŒã䜿çšããŠãæ°ãããªããžããªãè©ŠããŠã¿ãŸãããåŸè
ã¯èŠåã衚瀺ããŸããããã¹ãã¯æåŸ
ã©ããã«åäœããŸãã
@ColChããã§ã®åé¡ã¯ãã£ãã·ã¥ã«ãããšã¯æããŸããããããããããé©åãªååã¯JEST_USE_BASENAME_FOR_MOCKING
å¯èœæ§ããããŸãã
@cpojer FBã³ãŒãã§ååã®äžææ§ã«å¶éãããå Žåãã¢ãã¯ã®ãããã®ããŒãšããŠãã«ãã¹ã䜿çšããŠãåé¡ã¯çºçããŸããã
ç§ã¯æ£ããã§ããããããšãç§ãèŠãŠããªããã®ããããŸããïŒ
ç§ãèŠã2ã€ã®è§£æ±ºçã¯æ¬¡ã®ãšããã§ãã
getMockName
ãå€æŽããŠãããŒã¹åãŸãã¯ãã«ãã¹ã䜿çšãããªãã·ã§ã³ã«å¯Ÿå¿ããŸã@cpojerã®åçãèŠããšããã§ããã
ã¿ãªãããé ããŠãã¿ãŸãããä»ã¯ããããã®ãã®ã§ããªãããã¯ã¢ãããããŠããŸãã
ãã®ã·ã¹ãã ãæ¹åããããã«å¿
èŠãªJestã®é倧ãªå€æŽãè¡ãããšã«ããå Žåã¯ãç§ã¯å€§äžå€«ã ãšæããŸãã æåã®ã¢ãã¯ã¯æ¬åœã«ãã¡ããã¡ãã§ãããŸãæ©èœããŸããã ç§ãã¡ãããããããšã®1ã€ã¯ã "haste_modules": ['path/a', 'path/b']"
ãªã©ã®æ§æãªãã·ã§ã³ã䜿çšããŠããã€ã¹ãã¢ãžã¥ãŒã«ãïŒå
éšFBã¢ãžã¥ãŒã«ã·ã¹ãã ïŒã®ç¯å²ãå¶éãããã®å¥åŠãªã¢ãã¯ãå«ãããããã®ãã©ã«ããŒå
ã®ãã€ã¹ãã¢ãžã¥ãŒã«ã®ã¿ã確èªããããšã§ããåäœã 誰ãããã®å€æŽãå ãããã®ãªããããã¯é©ãã¹ãããšã§ãã
次ã«ç解ãã¹ãããšã®1ã€ã¯ãããã§ãã __mocks__/a.js
ãa.js
ã«ããããããããã«ããã¹ãŠã®æåã¢ãã¯ãããŒã«ã«ã§ããå Žåãnode_moduleã¢ãã¯ãã©ã®ããã«åŠçããŸããïŒ ããã«ã¯ããã€ãã®æ¹æ³ããããŸãã
__node_modules_mocks__
ãã©ã«ããŒãå°å
¥ããŸãããããã¯éãã§ããrootDir
ïŒãããžã§ã¯ãã«ãŒãïŒããèŠãæäžäœã®__mocks__
ãã©ã«ããŒã¯ãã°ããŒãã«ãã©ã«ããŒãšããŠæ©èœããå¯èœæ§ããããŸããèŠçŽãããšïŒ
["<rootDir>"]
ããã«èŠãããšæããŸãïŒã©ãæããŸããïŒ
é çªã«ïŒ
HURRAYïŒsmile ïŒïŒ tadaïŒ
æ¥ãã§ããŒãºãç解ã§ãããããããŸããã
ããããã®ã¢ãžã¥ãŒã«ã¯éæ»ã¢ãžã¥ãŒã«ã§ãããšèšãå¯èœæ§ãäžãããšããããšã§ããïŒ
4ã€ã®ã¢ãžã¥ãŒã«ãããå ŽåïŒ /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ïŒã®å Žåãã¢ãã¯ã¯node_modulesãã©ã«ããŒãšåã芪ãã£ã¬ã¯ããªã«é 眮ããå¿ èŠããããŸãã
ç§ã®èãïŒ
haste_modules
ã¯ãããšæããŸããããã¯collectCoverageFrom
ãä»ã®ãªãã·ã§ã³ãšåãããã«ãã£ããããŸãïŒã°ããã®é
å
ãã¹ãŠã®src
ã_haste_ã¢ãžã¥ãŒã«ãšããŠæã£ãŠããŠã1ã€ã®ãã£ã¬ã¯ããªã ããæ¥ãã§ããªãå ŽåïŒ
haste_modules: [
"src",
"!src/foo"
]
@EnoahNetzach誰ããã¢ããªã¢ãžã¥ãŒã«ãšnode_modulesã®ã¢ãžã¥ãŒã«ã«åãååãæã£ãŠããå Žåã¯ã©ããªããŸããïŒ
æ¥ãã§ãããæ©èœãããããã«...ããŒããç§ã¯ããã次ã®ããã«èª¬æã§ãããšæããŸãïŒ
ããŒãã¢ãžã¥ãŒã«
project/node_modules/react
äžãããããšãã¢ãã¯ã¯project/__node_modules_mocks__/react.js
å éšã«ãªããŸã
ãã¡ã€ã«project/react.js
ãããå Žåã¯ãproject/__mocks__/react.js
䜿çšããŸã
ïŒãã¡ããã react.js
ã¯äŸã§ããããã§ã¯ã npmããã€ã³ã¹ããŒã«ã§ãããã¹ãŠã®ã¢ãžã¥ãŒã«ã®äžã§ä»»æã®ãã¡ã€ã«åã䜿çšã§ããŸãïŒ
æ¬åœã«ã node_modulesã¢ãžã¥ãŒã«ããŸãããïŒ
node_moduleså ã®ã¢ãžã¥ãŒã«ã
ç§ãæ°ä»ããããã«ã react-nativeãããžã§ã¯ãã®å Žåã application modules
ãã¢ãã¯ãã node_modulesã®ã¢ãžã¥ãŒã«ãlodash
ïŒã
ã€ãŸãã次ã®ããã«ãªããŸãã
jest.mock
åŒã³åºãã®é·ããªã¹ã__èšãããããš__ïŒããã€ãã®ãã¹ã§ã¢ãžã¥ãŒã«ã_èªåã¢ãã¯_ããæ©èœããããšéåžžã«äŸ¿å©ã§ãã
ããã¯ãconfigå ã®ããç¥ãããããŒã¿æ§é array-of-jest-globsã®åšå²ã«å®è£ ã§ãããã®äžã§ã¢ãžã¥ãŒã«ããã£ã«ã¿ãªã³ã°ã§ããŸãã
ãã®ããšã段éçã«èª¬æããŸã
ãã®æ§æãšã³ããªãæå®ããŸã
"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
ãšã³ããªã§ã©ã®ããã«åçãããŸããïŒ
ç°¡åã«èšããšã automock: true
ã¯æ¬¡ãšåçã§ãã
"autoMockingPaths": [
"<rootDir>"
]
automock
ç¹å¥ãªäŸ¡å€ãå°å
¥ããã ããããããŸãããïŒ å°ãªããšãããã¯äººã
ã®èšå®ãå£ãããšã¯ãããŸãã
ããšãã°ã次ã®èšå®ãšã³ããªã䜿çšããŸãã
automock: "app"
jestã¯ãã¹ãŠã®ã¢ããªã±ãŒã·ã§ã³ã¢ãžã¥ãŒã«ãèªåã¢ãã¯ããã¢ãžã¥ãŒã«ã®å®éã®ããŒãžã§ã³ãnode_modules
ããæ®ããŸã
ã¢ããªã¬ãã«ã®ã¢ãžã¥ãŒã«ã®èªåã¢ããã³ã°ã @ cpojerã«ã€ããŠã©ãæããŸããïŒ ç§ã®ç¹å®ã®ã±ãŒã¹ã§ã¯éåžžã«å¹ççã ãšæããŸãã
"haste_modules"
ã«å®å
šã«åæããŸãã
ç§ãã¡ã¯å人çã«ãªãŒãã¢ããã³ã°ãããŸã䜿çšããªãã®ã§ãäœãè¯ããã¯èšããŸãããç§ã®å€§ãããªæšæž¬ã§ã¯ã "autoMockingPaths"
å€æ°ã¯ååã«äŸ¿å©ã§åŒŸåæ§ããããšæããŸãã
ããã©ããããç§ã¯"automock": "app"
ã硬ããããšæããŠããŸãïŒåè«ã¯ãã§ã«ããã©ã«ãã§èªåã¢ãã¯ãç¡å¹ã«ããŠããŸãïŒã
__node_modules_mocks__
ã¯ãªãã·ã§ã³ãããããŸãããç§ã¯åžå°æ§ãéããè£ãããšã«åæããŸãïŒç§ã®ç¹å®ã®ã±ãŒã¹ã§ã¯ã node_modules
ããããããšã¯ãã£ãã«ãªãããããããªããã°ãªããªããšãã¯jest.mock(...)
ã䜿çšããŸã
å¯äžã®æ³šæç¹ã¯æ¬¡ã®ãšããã§ãããã¹ããããnode_modules
ãã©ã«ããŒïŒäŸïŒ src/node_modules
ïŒãããå Žåããã®ã¢ãžã¥ãŒã«ãã°ããŒãã«__node_modules_mocks__
ããã¢ãã¯ããå¿
èŠããããŸããïŒããããŸãã¯éåžžã¯__mocks__
åãå Žæã«ãããŸããïŒ
誰ããnode_modules
ãšapp modules
åãã¢ãžã¥ãŒã«åãæã£ãŠããå Žåãåã«ã¹ããŒãããå¯èœæ§ããããŸã
äŸãã°
ã¢ããªã¢ãžã¥ãŒã«ãšããŠ
app/express.js
ïŒé»è»ã®ã²ãŒã ãããŠããå¯èœæ§ããããŸãïŒ
npmããã®WebãµãŒããŒãšããŠã®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
以éãããå Žåãã³ãŒãããŒã¹ã®ããæ·±ããšããã«ããã¹ããããnode_modules
ãã©ã«ããŒã«ã¢ãžã¥ãŒã«x
ãå®çŸ©ããŸãã ïŒ
ããŒãã³ã°ã®è¡çªã¯éåžžãæãè¿ããã®ãåªå ããããšã«ãã£ãŠããŒãã§åŠçãããŸããããããã©ã®ããã«æ¥ãã§æ©èœãããã¯ããããŸããã
Create React Appã®ãããªãããžã§ã¯ããããã䜿çšããŠããããè¿ãå°æ¥äœ¿çšããã®ã§ãç§ã¯ãããåãäžããŠã
ã¡ãªã¿ã«ã åé¡ã«äœããã®åœ¢ã§é¢é£ããŠããŸããïŒ
ãããéæ»ã®ä»çµã¿ã®å€æŽã«çŠç¹ãåããç¶ããŸãããïŒããã©ã«ãã§ã¯ãªããã¯ã€ããªã¹ã/ãã©ãã¯ãªã¹ãïŒã <rootDir>/__mocks__
ãããŒãã¢ãžã¥ãŒã«ã¢ãã¯ã®ããã©ã«ãã«ããå¿
èŠãããããšãç¶æããããšæããŸãã ãããæ§æãªãã·ã§ã³ã«ããããšãã§ããŸããããã©ã«ãã¯<rootDir>/__mocks__
ãglobalMocksãã§ãã 誰ããããã«åãçµãæ°ããããŸããïŒ
ç§ã¯æ¬¡ã®é±æ«ãŸã§ã«ããã«åãçµãããšãã§ããã¯ãã§ãã
ç§ã¯ãã®æ¥ææ¥ã«PRã«åãçµãããšãã§ããŸããç§ã¯ã¡ãã£ãšèªç±ã§ã
@cpojerèŠçŽããã ãã§ã-ããã©ã«ãå€<rootDir>/__mocks__
globalMocks
ãšã³ããªãäœæããŸãã ãã®ãªãã·ã§ã³ã¯ããã¹ãæå®ããããšã«ããã jestå
ã§ã®node-haste
䜿çšãèŠå¶ããŸããïŒ ãããšããã¹ã®é
åã«ãªããŸããïŒ
ãããã¯ããã解決ããããã®ããã€ãã®å€§ããªå€æŽã ãšæããŸãããåäžã®globalMocksãªãã·ã§ã³ïŒæååãŸãã¯æååã®é åïŒãšhasteModulesãªãã·ã§ã³ïŒéæ»ã¢ãžã¥ãŒã«ã®ãã¹ã®é åïŒã®äž¡æ¹ãå¿ èŠã ãšæããŸãã ãã®ã³ãŒãã®ã»ãšãã©ã¯ãjest-haste-mapãšjest-resolveã«ãããŸãã é©åãªãœãªã¥ãŒã·ã§ã³ãã©ã®ããã«ãªããã¯ãŸã 100ïŒ ããããŸããã
æçš¿è
ïŒããã¯ã¹Sysoev [email protected]
éä¿¡æ¥ïŒ2016幎12æ9æ¥éææ¥8:18:44 AM
å®å
ïŒfacebook / jest
CcïŒChristoph Pojer; èšåãã
件åïŒReïŒ[facebook / jest] [ãã°]å¥ã®ãã£ã¬ã¯ããªã§éè€ããæåã¢ãã¯ãèŠã€ãããŸããïŒïŒ2070ïŒ
ç§ã¯ãã®æ¥ææ¥ã«PRã«åãçµãããšãã§ããŸããç§ã¯ã¡ãã£ãšèªç±ã§ã
@cpojerhttps ïŒ//github.com/cpojerèŠçŽããã ãã§ã-ããã©ã«ãå€ã®globalMocksæ§æãšã³ããªãäœæããŸã
-
ããªããèšåãããã®ã§ããªãã¯ãããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããããGitHub https://github.com/facebook/jest/issues/2070#issuecomment-265958606ã§è¡šç€ºããããã¹ã¬ããããã¥ãŒãããŸãhttps://github.com/notifications/unsubscribe-auth/AAA0KAMFc34iKqBDLHZzgaGHqyc3WkAzks5rGQ7kgaJp
ç³ãèš³ãããŸããããç§ã®ã¯ãŒã¯ã¹ããŒã·ã§ã³ãå£ããŠããŸããæ°ãæïŒ1ã2ãæïŒã§åäœãããæ¹æ³ããªãããã§ãã ç§ããã®PRã§ç§ã®ãããžã§ã¯ãã倱ããŸãã:(ã ããã責任ãåã£ãŠç³ãèš³ãããŸããã
getMockName
åäœãå€æŽããããã®èšå®ãªãã·ã§ã³
jestã®å
éšã«ã€ããŠã¯ããŸã詳ãããããŸããããFBã®jestãå£ããã«åé¡ãä¿®æ£ããããã®æãç°¡åãªè§£æ±ºçã®ããã§ãã
ããã¯ç§ãåœåæã£ãŠãããããè€éã«ãªãã§ãããã ç§ã«ãšã£ãŠãæåã¢ãã¯ã¯ãæãè¿ããã¡ã€ã«ã眮ãæããå¿ èŠããããŸãã ãã®ãããªãã®ïŒ
{ '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
ã
jestæåã¢ãã¯ãã»ããã¢ããããæ¹æ³ã«ã€ããŠã®ç§ã®ç解ïŒãããŠäžèšã®ãããªãã®ã䜿çšãããŠããå Žåã¯ããããããå€ãã®ããã¥ã¡ã³ããããã¯ãã§ãïŒã¯ããããã__mocks__
ãã£ã¬ã¯ããªå
ã®ã¢ãã¯ãããŠãããã¡ã€ã«ã«ã§ããã ãè¿ãã¯ãã§ãããšããããš
æåã¢ãã¯ã¯ãã¢ãžã¥ãŒã«ã®ããé£ã®__mocks __ /ãµããã£ã¬ã¯ããªã«ã¢ãžã¥ãŒã«ãæžã蟌ãããšã«ãã£ãŠå®çŸ©ãããŸãã ïŒhttps://facebook.github.io/jest/docs/manual-mocks.htmlïŒ
ãããèãããšãäžèšã®åäœã¯ç§ã«ãšã£ãŠæãçã«ããªã£ãŠããŸãã
èãïŒ
ããã¯ãäžèšã®ãããªãã®ãå®è£ ããããã®æåã®ãã¹ã§ãïŒ https ïŒ
次ã®ãããªçŽç²ãªãååä»ããã¢ãã¯ãèš±å¯ãããªããªã£ããããjestãŠããããã¹ãã®å€§éšåã倱æããŸãïŒ https ïŒ
IMOã createRuntime
ãããªãã®ã¯ãtest utilsãã©ã«ããŒã«ããããããå¿
èŠãšãããã¹ãã«ã€ã³ããŒããããå¿
èŠããããã¹ããŠãŒãã£ãªãã£ã§ãã æåã¢ãã¯ãšããŠå®è£
ããæ¹æ³ã¯ãä¿åããå¿
èŠããããã®ãšããŠç§ã«ã¯ããŸãæå³ããããŸããã
1ã€ã®ãªãã·ã§ã³ã¯ãæ¢åã®åäœãšäžèšã®å€æŽã®ã¯ãªãŒã³ã¢ããããŒãžã§ã³ãåãæ¿ããæ§æå€æ°ãè¿œå ããããšã§ãã ãããããããäœãšåŒã°ããã¹ããã¯ããããããŸããã
Facebookã§ã¯éåžžã«å€§ããäŸåããŠãããããçŸåšã®åäœãç Žãããšã¯ã§ããŸããã
@cpojeråæããŸãã ã³ãŒããèªãã åŸãç§ã¯ãã®ã³ã¡ã³ããæ¬åœã«ç解ããŠããŸããã§ããïŒ https ïŒ//github.com/facebook/jest/issues/2070#issuecomment-265027510ã çŸåšã®åäœã«è§£æ±ºããããã£ã¬ã¯ããªã®ãªã¹ãããã¯ã€ããªã¹ãã«ç»é²ããããšããµããŒãã§ããã§ããããã
2ã€ã®æ°ããæ§æãªãã·ã§ã³ã«ã€ããŠã¯ã©ãã§ããããã
fullPathMockResolution
ïŒæ¢åã®åäœãç¶æããããã«ããã©ã«ãã§false
ïŒnamedMockDirectories
ïŒ fullPathMockResolution
ãæå¹ã«ãªã£ãŠããå Žåããã®é
åå
ã®ãã¹ãŠã®ãã£ã¬ã¯ããªã¯æ¢åã®åäœã§è§£æ±ºãããŸãã FBã®ãŠãŒã¹ã±ãŒã¹ã®å Žåãããã¯äžèšã®ããã«[<rootDir>]
ã«ãªããŸããããã«ãããéçºè ã¯ãã«ãã¹è§£æ±ºãéžæã§ãããããæ¢åã®jestã€ã³ã¹ããŒã«ã«ããå€æŽãäžèŠã«ãªããå¿ èŠã«å¿ããŠç¹å®ã®ãã£ã¬ã¯ããªã®æ¢åã®åäœãæå¹ã«ãªããŸãã
cc @voideanvalueããã¯ããªããèããªããã°ãªããªãããšãããããŸããïŒæ°ããéæ»å®è£ ã®äžéšãšããŠã®åå空éæåã¢ãã¯ïŒã
+1ããããä¿®æ£ããæ¹æ³ã¯ãããŸããïŒ
+1
ãã®åé¡ãä¿®æ£ããæ¹æ³ã«é¢ããæŽæ°ã¯ãããŸããïŒ ãã®ãããªæ§é ã«åŸããšãããã¯æ¬åœã«èŠçã§ããããšãããããŸãã
project/
âââ models
â âââ index.js
â âââ __mocks__/
â â âââ index.js/
âââ challenges
â âââ index.js
â âââ __mocks__/
â â âââ index.js/
çŸåšããã¹ãèæ ®ããå¿ èŠããããããå®éã«ã¯ç«¶åããååããªãå Žåã§ããã競åãããååã®2ã€ã䜿çšããŠããå Žåã¯ããã¹ãã§ã¢ãžã¥ãŒã«ãæåã§ã¢ãã¯ããå¿ èŠããããŸãã
也æ¯ã
ãããã¯
@cpojerããã«æŽæ°ã¯ãããŸããïŒ åé¿çã¯ãããŸããïŒ
ç§ã«ãšã£ãŠã®ã¡ãã£ãšããåé¿çã¯ãrequireã§ã¢ãžã¥ãŒã«ãã¢ãã¯ããããšã§ã
jest.mock('models/index', () => require('models/index/_mocks_/index'));
jestããã¡ã€ã«ããã£ããããªãããã«ã __mocks__
ãã©ã«ããŒåã_mocks_
ãã
ãããæ©èœããããæ¥ã _mocks_
ååã__mocks__
ãjest.mockããrequireéšåãåé€ããŸãã
ãŸããçŽ æŽãããä»äºãããããšãã
第äºã«ïŒããã¯æ¬åœã«ãããªãã€ã©ã€ã©ããŸãã ã¢ãã¯ããããã¡ã€ã«ããåããã¢ãã¯ãããã³ãŒãããŒã¹å
šäœã®ä»ã®ãã¡ã€ã«ãšååãå
±æããŠããå Žåããã¹ããã¡ã€ã«ã§jest.mockã䜿çšããããšãäœåãªããããŠããŸãã å·»ãäžãã§ã¯å®éã®ã¢ãã¯ãã€ã³ããŒãã§ããªãããããã¡ã€ã«ãã¢ãã¯ããå¿
èŠããã2ã€ã®ãã¹ãã§ã¢ãã¯ãè€è£œããå¿
èŠãããããã¹ãã¹ã€ãŒãã®è匱æ§ãå¢ããŸãã ããã«å¯ŸåŠããããšãæ€èšããŠããŸããïŒ FBã¯ããã䜿çšããŸããïŒ ã¯ãã®å Žåãã©ã®ããã«ïŒ ð
ãããã®èŠåãèŠãã®ã¯éåžžã«ã€ã©ã€ã©ããŸãã ä¿®æ£ãåŸ ã€ããšã¯ã§ããŸããã
ç§ãæ±ããŠããåé¡ã¯é¢é£ããŠãããšæããŸãïŒ
jest.mockïŒ 'src / utils / history'ïŒãããå Žåã 'history'node_moduleã誀ã£ãŠã¢ãã¯ããŸãã
ã¿ããªæŽæ°ã¯ãããŸããïŒ
@masoudcsããã¯èŠåãåãé€ãããšæããŸãïŒ
package.json
"jest": {
/* other settings ... */
"modulePathIgnorePatterns": ["<rootDir>/node_modules/react-native/Libraries/Core/__mocks__"]
}
modulePathIgnorePatterns
é
åã«ãduplicateããã©ã«ããè¿œå ãããšãèŠåãæ¶ããŸã
ããããšã@brunolm
ã ããããã¯ãã ã®èŠåã§ãããïŒïŒ
ãããäœãæªãããšãèµ·ãããªãããã«ãããã ãã§ããã€ãŸããè€æ°ã®ãã£ã¬ã¯ããªã§index.jsãã¢ãã¯ããŸãã
src/app/modules/module1/__mocks__/index.js
ããã³src/app/modules/module2/__mocks__/index.js
ãããéèŠãã©ããã¯ããããŸããããç§ãå®è¡ããŠãããšããããã¯ä»ã®ãã®ã ããéžã¶ãšèšã£ãŠããŸããããããŠç§ããªã¹ãããããã¯ã©ã¡ãã®æ¹æ³ã§ãç¡èŠãããŸãã
ã§ããããç¡èŠããããã«èšã£ãŠããããšæããŸãããšã«ãã䜿ã£ãŠããŸããã§ããã
ã¯ããããªããèšã£ãããã«ãç§ãã¡ã¯ä»ãŸã§äœã®åé¡ã«ãçŽé¢ããŠããŸããã§ããã
ããŸãããã°ãããã¯ãããããªããã°ãªããªãããšããã£ãŠããŸãïŒ :)
ããããšã
ãã®æåŸã®2ã€ã®ã³ãããã瀺åããããšãè©ŠããŸããããèŠåã¯åé€ãããŸããã§ããã
jest.mock('dir/index', () => require('dir/__mocks_/index'));
æ§æã«testPathIgnorePatterns: ['/_book/', ...otherStuff]
ãããã®ã«ãGitBookïŒ ./_book
ãã£ã¬ã¯ããªïŒã䜿çšããŠããããããã®èŠåã衚瀺ãããŸãã ãã®åé¡ããã£ãšèŠãŠã¿ããšãæ確ãªåé¿çã¯èŠåœãããŸããã èŠåã衚瀺ãããªãããã«ãããã ãã§ããå©ããŠããã ããã°å¹žãã§ãã
+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.mock.ts
ãäœæãããããã¬ãã«ã®test.mocks
ã®mockedModules
é
åã«å
ã®ãã¹ãè¿œå ããããšã§ã anything.ts
ãã¢ãã¯ããããšãã§ããŸãã
ãã®åé¡ãæ¡åŒµãšããŠã¿ã°ä»ããããŠããã®ã¯ãªãã§ããïŒ
ããã¯ç§ã«ãšã£ãŠã¯ããŸãããããã§ãã jest.config.jså ïŒ
module.exports = {
// ...
modulePathIgnorePatterns: ["<rootDir>/.*/__mocks__"]
};
ç§ã¯å°ããªãããžã§ã¯ããæã£ãŠããã®ã§ããã®å€æŽã®ç¯å²ã圱é¿ã«ã€ããŠã¯ããããããŸããã
@amccloudããããšãïŒ ããã§ç§ã®åé¡ã¯è§£æ±ºããŸããïŒ è©³çŽ°ã¯ä»¥äžãã芧ãã ããã
ãããžã§ã¯ãã®ã«ãŒããã£ã¬ã¯ããªã«ã¢ãžã¥ãŒã«helpers
ããããŸãã ãã«ããŒã¯é¢æ°parseNodeFromString
ãšã¯ã¹ããŒãããŠããŸãã
ä»ã®ã¢ãžã¥ãŒã«ããŒã«ã«ãã¡ã€ã«helpers
äœæããŸããã ããããç§ã¯ç§ã®ãã¹ãã®1ã€ã®ããã«ããããããããŸããã ãããŠãé¢æ°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
ãããã®ã¯ããªãäžè¬çã§ãã èŠåã«ã¯ããªãã®ã¹ããŒã¹ãå¿
èŠã§ãããå®éã®èŠåãå®å
šã«é衚瀺ã«ããããããŸããã
ã§ã¯ãPRã®çŸç¶ã¯ã©ããªã£ãŠããã®ã§ããããã é©åãªè§£æ±ºçãããã¯ã¯ãããŸããïŒ
ç§ã®å Žåãã¢ãã¯ã¢ãžã¥ãŒã«ã¯ãã«ãããšã«Distdirã«ã³ããŒãããŸããã
ããã¯ãtypescriptãããæ·±ãdiræ§é ã«å±ãããã¹/ãã¿ãŒã³ãé€å€ã§ããªããšããåé¡ã®ããã§ãã ããã¯ãŸã ãtypescript@^3.4.5ãã®åé¡ã§ãã
ãããä¿®æ£ããããã«ããã¹ãŠã®ãã¹ããå®è¡ããåã«ããrimrafdistãã䜿çšããŠDistãã£ã¬ã¯ããªã®ã¯ãªãŒãã³ã°ãéå§ããŸããã
"test:unit": "npm run clean && stencil test --spec --snapshot",
ç§ã¯ãã®ããã¯ãç¥ã£ãŠããŸãããæ©èœããŸãã
ãããç§ã¯ãããããã§è§£æ±ºããŸããããããŠå€åããã¯ããªãããããè€è£œããã®ãå©ããããšãã§ããŸãã
3ã€ã®ãœãªã¥ãŒã·ã§ã³ãŸãã¯ã·ããªãªïŒ
1ãããã¹ããšãã£ã¿ãŒã§ã¢ããªã2åç·šéããŠããŸãããã€ãŸãã2ã€ã®ç°ãªããŠã£ã³ããŠãããããã®ã€ã³ã¹ããŒã«/æŽæ°ãšreact-nativerun-iosãå®è¡ããŠããŸããã ãã®ãšã©ãŒãçºçããŸãããXcodeãšã¢ããªã§éè€ãââã¡ã€ã«ãæ€çŽ¢ããããšããŸããããèŠã€ãããŸããã§ããã ã ããç§ã¯åã«ã·ãã¥ã¬ãŒã¿ãŒããã¢ããªãåé€ããreact-native run-iosãåå®è¡ããŸããããããŠããã¯æ©èœããŸããã2ã€ã®node_modulesããã®ããã«è€è£œãããããšãããããŸããïŒç§ã®scrãã¡ã€ã«ã®node_modulesãšnode_modules0ã
2ãMacã§ã©ã³ãã ããŒãæŒããšãããšãã°SRCãã©ã«ããŒã«node_modulesãè€è£œãããããšãããã®ã§ããããåœãŠã¯ãŸããŸãããããã£ãŠãnode_modulesã®éè€ããªãããã©ã«ããŒã確èªããã®ã¯çã«ããªã£ãŠããŸãã
3ãåãã·ãã¥ã¬ãŒã¿ãŒã§å¥ã®ã¢ããªãèµ·åããŠçµäºããè€è£œã䜿çšããŠã¢ããªãåèµ·åãããŸã§ã¢ããªãèµ·åã§ããŸããã§ããããã®åŸããšã©ãŒãªãã§èµ·åããŸããã
ãŸã äœããããŸãããïŒ CRAã§modulePathIgnorePatternsã䜿çšã§ããŸãã
3幎10ã¶æ
ãŸãã¯ãèŠåã ãã§ãªãããã®åé¡ãçºçãããšãã«Jestã«ãšã©ãŒãã¹ããŒãããããšãã§ããã°äŸ¿å©ã§ãã èŠåã¯ç°¡åã«ç¡èŠãããŸãã ç§ã®ãããžã§ã¯ãã§ã¯ããšã©ãŒãã¹ããŒãããããšãæãã§ããã®ã§ããããå°å ¥ããéçºè ã¯ããã«å¯ŸåŠããå¿ èŠããããŸãã
æãåèã«ãªãã³ã¡ã³ã
ããã¯ç§ã«ãšã£ãŠã¯ããŸãããããã§ãã jest.config.jså ïŒ
ç§ã¯å°ããªãããžã§ã¯ããæã£ãŠããã®ã§ããã®å€æŽã®ç¯å²ã圱é¿ã«ã€ããŠã¯ããããããŸããã