ç·šéïŒéå§ããããã®ã¯ã€ãã¯ã¬ã€ãïŒ https ïŒ
ESMãµããŒãã¯ããŒã12ã®å°æ¥ã®ãªãªãŒã¹ã§ãã©ã°ãç«ãŠãããªããªãïŒãããã4æ以åã§ã¯ãªãhttps://github.com/nodejs/node/pull/29866#issuecomment-574055057ïŒãããŒã13.2ã§ã¯ãã§ã«ãã©ã°ãç«ãŠãããŠããªãã®ã§ã Jestã«ãã€ãã£ããµããŒããè¿œå ããæ¹æ³ãè©äŸ¡ããæéã§ãã JestãçŸåšæäŸããŠãããESMãµããŒãã®åœ±é¿ãåããæ©èœãšããããã解決/調æ»ããæ¹æ³ããªã¹ãã¢ããããŠã¿ãŸãã
åé¡ïŒ4842ããããŸãããããã¯ãã£ã¹ã«ãã·ã§ã³ã®åé¡ã§ãããšæããŸãããã®åé¡ã¯ãå®éã«ãµããŒããå®è£ ããããšãç®çãšããŠãããçŸåšã®å®è£ ã¹ããŒã¿ã¹ãååŸãããã ãã®äººã远跡ããã®ã«é©ããŠããŸãã ãã®åé¡ã«è¿œå ãããã³ã¡ã³ãã¯ã以äžã«åæãããæ©èœã®ãµããŒããå®è£ ããæ¹æ³ã«é¢é£ããŠããªããããã¹ãã ãšããŠããŒã¯ãããŸããåé¿ç/ãã£ã¹ã«ãã·ã§ã³ã¯ãå¥ã®åé¡ã«è»¢éããŠãã ããã ãŸããESMæ©èœã«é¢é£ãããã®ããªã¹ãã«ãªãå Žåã¯ããæ°è»œã«ãç¥ãããã ããã
Jestã¯vm
APIïŒhttps://nodejs.org/api/vm.htmlïŒã䜿çšããå·çæç¹ïŒããŒãv13.6ïŒã§ã¯ããã®APIã®ESMéšåã«ãã©ã°ãä»ããããŠããããšã«æ³šæããŠãã ããïŒ --experimental-vm-modules
ïŒã ãããã£ãŠãESMã«ãã©ã°ãä»ããããŠããªããšèšãã®ã¯ãçŸæç¹ã§ã¯å°ã誀称ã§ãã ããããå®éšãéå§ããã¢ãžã¥ãŒã«WGã«ãã£ãŒãããã¯ãæäŸããå¿
èŠããããšæããŸãã
æåŸã«ãç§ã¯äž»ã«ãµããŒããå®è£ ãã人ã ã®ããã«ãã®åé¡ãæžããŠããã®ã§ãããã¯ããäœã¬ãã«ã§ãJestãã©ã®ããã«æ©èœãããã«åºæã®ãã®ã«ãªããŸãã ãµããŒããéå§ããããã©ãããç¥ãããå Žåã¯ãGHã®ãã°ããããã«ã¹ã¿ã éç¥ãã䜿çšããŠãçµäº/åéæã®éç¥ã®ã¿ããµãã¹ã¯ã©ã€ãããããšããå§ãããŸãã
ç¹å®ã®vm.Context
ïŒJSDOMãŸãã¯ããŒãã³ã¢APIã®ããããã«ãã£ãŠæäŸãããïŒå
ã§ã¹ã¯ãªãããå®è¡ããããšã«ããããµã³ãããã¯ã¹ãå®çŸããŸãã ESMã«ã€ããŠãåãããšãè¡ãå¿
èŠããããŸãããã¢ãžã¥ãŒã«ã®å®è¡æã ãã§ãªããã¢ãžã¥ãŒã«ã®æ§ç¯äžã«context
ã«ã¢ã¯ã»ã¹ããå¿
èŠããããŸãã JestEnvironment
å¿
èŠãªAPIãè¿œå ããïŒ9428ãéããŸããã
expect
ã test
ã beforeEach
ãªã©ã¯åŒãç¶ãã°ããŒãã«ãšããŠè¿œå ãããŸããããã§ã¯äœãå€æŽããªãã§ãã ããã jasmine
ã°ããŒãã«ãããã«ãããŸãã
jest
ãã°ããŒãã«ãããããã£ããã¯å®éã«ã¯ã°ããŒãã«ã§ã¯ãªããã¢ãžã¥ãŒã«ã¹ã³ãŒãã«æ¿å
¥ãããŸãã ã¢ãžã¥ãŒã«ã¹ã³ãŒãã¯ESMã§ãªããªã£ãã®ã§ãã©ããã«ç§»åããå¿
èŠããããŸãã import.meta
è¿œå ããã®ã¯èªç¶ãªããšã®ããã§ãã initializeImportMeta
ãšãããªãã·ã§ã³ã䜿çšã§ããŸãã
ç·šéïŒããã§ã®è§£æ±ºçã¯ã import {jest} from '@jest/globals'
ä»ããŠããããã§ããããããšã§ãã å°æ¥çã«ã¯import.meta
ãä»ããŠè¿œå ããå¯èœæ§ããããŸãããçŸæç¹ã§ã¯ããã§ååã§ãã
jest.(do|un)mock
ã¢ãžã¥ãŒã«ãè©äŸ¡ãããšããESMã«ã¯ããŸããŸãªãã¹ããŒãžãããããããéçã€ã³ããŒãã§ã¯jest.mock
ã¯æ©èœããŸããã ãã ããåçã€ã³ããŒãã§ã¯æ©èœããå¯èœæ§ããããããããã¥ã¡ã³ãã§ãµããŒããããŠãããã®ãšãµããŒããããŠããªããã®ãæ確ã«ããå¿
èŠããããšæããŸãã
jest.mock
é話ã¯åŒãäžããããŸãããESMã§ã¯åœ¹ã«ç«ã¡ãŸããã import 'thing'
ãimport('thing')
å€æããããšãæ€èšãããããããŸãããããã«ãããå·»ãäžããæ©èœããã¯ãã§ãããéåæã«ãªããŸãã ãããã¬ãã«ã®await
ã¯ããããããã®ãããªã¢ãããŒãã®å¿
èŠæ§ã§ãã ãŸããå¥ã®ãªãã·ã§ã³ãä¿èšŒããã®ã«ååãªäŸµè¥²æ§ããããšæããŸãã 話ãåãããšããããŸã-åæãªãªãŒã¹ã§jest.mock
ãå¯èœãªãã¹ãŠããµããŒãããå¿
èŠã¯ãããŸããã
jest.requireActual
ESMã§ã©ã®ããã«åäœãããããããªãã jest.importActual
ãæäŸãã requireActual
CJS
åžžã«
import.meta
ããŒãã«ã¯ãå¯äžã®ããããã£ãšããŠurl
ããããŸãïŒå°ãªããšãä»ã®ãšããïŒã Jestã«ãå
¥åãããŠããããšã確èªããå¿
èŠããããŸãã æã
ã¯æäŸidentifier
ã®ä»£ããã«filename
ç§ã¯ãããèªåçã«èµ·ããã ãããšã¯æããªãã®ã§ãã¢ãžã¥ãŒã«ãæ§ç¯ãããšãããããurl
æ¬è³ªçã§ããfilename
ããããããæž¡ãããŸããpathToFileURL
ã
import.meta.resolve
ãªãŒãã³PRããããŸãïŒ //github.com/nodejs/node/pull/31032
import thing from 'thing'
ããã¯å®éã«ã¯ããªãç°¡åãªã¯ãã§ãã linker
ãå®è£
ããã ãã§ããœãŒã¹ãè¿ãåã«å€æããããšãã§ããŸããã€ãŸããããŒããŒAPIïŒãŸã ååšããŠããŸããïŒã¯å¿
èŠãããŸããã ããã«ãããã¢ãã¯ãè¿ãããšãã§ããŸãïŒãã ããã¢ãã¯ã¯__mocks__
ãã£ã¬ã¯ããªããååŸããå¿
èŠããããŸãïŒã
import('thing')
åºæ¬çã«äžèšãšåãã§ãããã¢ãžã¥ãŒã«ã®æ§ç¯æã«importModuleDynamically
ãšããŠæž¡ãããŸãã ãŸãã jest.mock
ã jest.resetModules
ãªã©ãããã¯ãªãŒã³ã«ãµããŒããããããããªã䜿çšãããå¯èœæ§ããããŸãã
ããã¯ãåããªãã·ã§ã³ã䜿çšããŠvm.Script
ã§å®è¡ããããšãã§ããŸãã
çŸåšãããã¯ã©ã³ã¿ã€ã ãšã©ãŒã§ãïŒã¢ãžã¥ãŒã«ãèŠã€ãããªããªã©ïŒããESMã§ã¯å¿ ããããããšã¯éããŸããã ããã¯ç§ãã¡ã«ãšã£ãŠéèŠã§ããïŒ ãšã©ãŒããŸã èŠæ ããããããšã確èªããå¿ èŠããããŸãã
module.createRequire
ESMã®CJSã䜿çšããã人ã®ããã«ããã«å¯ŸåŠããå¿ èŠããããŸãã ïŒ9426ãéããŠããããåå¥ã«è¿œè·¡ããŸããããããå®è£ ããããšã¯ãESMãµããŒããšã¯å®éã«ã¯é¢ä¿ããªãããã§ãã
ç·šéïŒïŒ9469ã§å®è£
module.syncBuiltinESMExports
https://nodejs.org/api/modules.html#modules_module_syncbuiltinesmexportsã ç§ãã¡ã¯ãããæ°ã«ããŸããããããšãåã«ãããããŒãªãã¬ãŒã·ã§ã³ã«ããŠããã ãã§ããïŒ Jestã®ãŠãŒã¹ã±ãŒã¹ãã©ããªããããããªãã ãã«ãã€ã³ããããããšã¯ãã§ã«ãµã³ãããã¯ã¹ãå£ããŠããã®ã§ãããã¯åé¡ã§ã¯ãªããšæããŸãã
ç·šéïŒïŒ9469ã¯ãããããŒãªãã¬ãŒã·ã§ã³ã«ããŸããã 倧äžå€«ã ãšæããŸããïŒ
ã¢ãžã¥ãŒã«ã®package.json
type
ãã£ãŒã«ãã調ã¹ãã®ã¯åŠ¥åœãªããã§ãïŒ https ïŒ
https://github.com/nodejs/modules/issues/393
moduleNameMapper
ãããäœãã«åœ±é¿ãäžãããã©ããã¯ããããŸããã ã¢ãžã¥ãŒã«ãèªåãã¡ã§ãªã³ã¯ããã®ã§ãç§ã¯ããã¯æããŸããã ãã ãã調æ»ãå¿ èŠã§ãã
ç·šéïŒããã¯ãç§ãã¡ãå¶åŸ¡ãããã¹ãŠã®è§£æ±ºããžãã¯ã§ãã ãããã£ãŠãããã§ã¯å€æŽã¯ãããŸããã
jest.config.mjs
ïŒ9291ãéããŠjest.config.cjs
ããµããŒãããŸã- .mjs
ããã«äœãç¹å¥ãªããšãããå¿
èŠããããŸããïŒ ããããimport('path/to/configFile.mjs')
ã䜿çšããŸããããã¯ãéåæã§ããå¿
èŠãããããšãæå³ããŸãã ããã¯åé¡ã§ããïŒ Jest25ã§æ§æ解決ãasync
ã«ãã䟡å€ããããããããªãã®ã§ãJest25ã§ã®ESMã®å¢åãµããŒãã®ãããã«ãŒã§ã¯ãããŸããã
ç·šéïŒïŒ9431
Nodeã¯ããã±ãŒãžã®ãšã¯ã¹ããŒãããµããŒããmoduleNameMapper
ã«ãããã³ã°ãããŸãããã«ãã»ã«åæ©èœãæäŸããŸãã resolve
ããããå®è£
ããããšãé¡ã£ãŠããŸãããå®è£
ãããŠããªãå Žåã¯ãäœããè¡ãå¿
èŠããããŸãã pathFilter
ãªãã·ã§ã³ã䜿çšããã®ã«ååã§ããããïŒ ããããªãã
https://nodejs.org/api/esm.html#esm_experimental_json_modulesã æ°ã«ããå¿
èŠããããŸããïŒ ãããããç¹ã«json
ã ãªã³ã¯ãã§ãŒãºãå¶åŸ¡ããããã import thing from './package.json'
ããµããŒãããã®ã¯ç°¡åã§ãããããã©ã«ãã®ããŒããšã¯ç°ãªããããããã©ã«ãã§ãµããŒãããã¹ãã§ã¯ãããŸããã 人ã
ã«ããã«å¯Ÿããå€æãå®çŸ©ããããã«åŒ·å¶ããå¿
èŠããããŸããïŒ
ããã¯éèŠã§ããïŒ ãœãŒã¹ãbabelã§å€æã§ããã®ã§ïŒããããimport
ã¹ããŒãã¡ã³ãã§æ··ä¹±ãããããããŸãããïŒãV8ã«ãã¬ããžã¯ééããªãæ°ã«ããªãã¯ããªã®ã§ã圱é¿ã¯ãªããšæããŸãã ãã ãã確èªããå¿
èŠããããŸãã
åæ解決ã¯åé¡ãªãæ©èœãããããããã¯ãŸã£ãããããã«ãŒã§ã¯ãããŸããã ããããä»ã¯éåæ解決ã䜿çšã§ããŸããããã¯çŽ æŽãããããšã§ãã ãã§ã«éåæããµããŒãããŠããã®ã§ãnpmããresolve
ã¢ãžã¥ãŒã«ã䜿çšããããšãããäžåºŠæ€èšããå¿
èŠãããã®ã§ã¯ãªãããšæããŸãã ïŒ9505ãåç
§ããŠãã ããã
äžèšãšåæ§ã«ããããã¯ããŸãããããµããŒããããšäŸ¿å©ã§ãã @jest/transformer
ãä»ã®ç°å¢ã§ã䜿ããããããå¯èœæ§ããããŸãã ïŒ9504ãåç
§ããŠãã ããã
ïŒ5163ã«ãããåé¿çãšããŠextraGlobals
ãªãã·ã§ã³ããããŸãããã®åé¿çã¯ESMã§ã¯å®è¡ã§ããªããªããŸããã ããã§ããŒããéããŠåé¡ã解決ããŸããïŒ https ïŒ
ïŒ9772ã§éåžžã«åºæ¬çãªãµããŒããéå§ããŸããã ç§ã¯æãåçŽãªã±ãŒã¹ã®ã¿ããã¹ãããŸãããå€ãã®æ¢ç¥ã®å¶éããããŸãïŒç¹ã«ãCJSãšESMãæ··åšãããå Žåã®jest
ãªããžã§ã¯ãã®ãµããŒããšå£ããã»ãã³ãã£ã¯ã¹ã¯ãããŸããïŒããå°ãªããšãããã¯_äœã_ã§ãã Jestã®æ¬¡ã®ãªãªãŒã¹ã§ãªãªãŒã¹ãããäºå®ã§ãïŒã§ããã°ããã«ãïŒ9806ã«ãã£ãŠã®ã¿ãããã¯ãããŸãïŒ
25.4.0ã¯ãæåã®ãµããŒããšãšãã«ãªãªãŒã¹ãããŸããã äžèšã®ïŒ9772ã«å ããŠãïŒ9842ãå«ãŸããŠããŸãã _çè«_ã§ã¯ãCJSãšESMã®æ··åãæ£ããæ©èœããããã«ãªããŸããïŒð€ïŒã
äžè¶³ããŠããäž»ãªæ©èœã®1ã€ã¯ã jest
ãªããžã§ã¯ãã®ãµããŒãã§ãã import.meta
åºå·ãããã import {jest} from '@jest/globals'
ããã€ã³ããŒãããããã«èŠæ±ãããã¯æ±ºããŠããŸããã ãã£ãŒãããã¯ãããã ããã°å¹žãã§ãã
ãã®ããã®ããã¥ã¡ã³ãã¯ãŸã äœæããŠããŸããããã¢ã¯ãã£ãåããã«ã¯3ã€ã®ããšãè¡ãå¿ èŠããããŸã
import
ã¹ããŒãã¡ã³ããå®è¡ããªãããã«ããŠãã ããïŒæ§æã§transform: {}
ãèšå®ãããã babel
ããã¡ã€ã«ãCJSã«å€æããªãããã«ããŸãïŒ modules
ãåé¿ãããªã©ïŒãããªã»ããç°å¢ãžã®--experimental-vm-modules
ãã©ã°ãæå®ããŠnode@^12.16.0 || >=13.2.0
ãå®è¡ããŸãjest-environment-node
ãŸãã¯jest-environment-jsdom-sixteen
ãã¹ããå®è¡ããŸããã²ãè©Šãããã ãããã£ãŒãããã¯ããå¯ããã ããã ãã°ãå ±åããå Žåã¯ãåãã³ãŒãïŒãã¹ãåºæã®ã³ãŒããé€ãïŒã®å®è¡ãNodeã§ã©ã®ããã«å®è¡ãããããå«ããããšãã§ããã°çŽ æŽããããšæããŸãã éå»æ°é±éã«ããã£ãŠhttps://nodejs.org/api/esm.html_a lot_ãèªã¿ãŸããããããããäœããèŠéããŸããã
äžè¶³ããŠããäž»ãªæ©èœã®1ã€ã¯ãjestãªããžã§ã¯ãã®ãµããŒãã§ãã import.metaã«åºå®ããããã€ã³ããŒã{jest} from '@ jest / globals'ã䜿çšããŠã€ã³ããŒãããããã«èŠæ±ãããã¯æ±ºããŠããŸããã
typescriptã®ãŠãŒã¹ã±ãŒã¹ã§ã¯ãæ瀺çã«ã€ã³ããŒãããããšããå§ãããŸãã
ã¯ããããããµããŒããã@jest/globals
ããã±ãŒãžãè¿œå ããŸããïŒäžæçã«å
ã«æ»ããŸããïŒã®ã§ãé¢ä¿ãªãå©çšã§ããŸãã import.meta
å
¬éããã®ãçã«ããªã£ãŠããã®ã ãããã çŸåšãäž»ã«åŸã§åé€ãããããè¿œå ããæ¹ãç°¡åã§ãããããããããªãããšã«åŸããŠããŸãïŒãããŠç§ã¯å人çã«ã°ããŒãã«ã®ãã¡ã³ã§ã¯ãããŸããïŒ
æ瀺çãªã€ã³ããŒãã®å Žåã¯+1ãå°ãåé·ã§ããç解ããããã§ã
ããã¯ããŒã13.2ãšJest25.4ã§ååŸããŠãES Modules are only supported if your test environment has the
ïŒ function
äœã足ããªãã®ã§ããïŒ
@zandaqoãã¿ãŸããããã®ç¹ãå¿ããŠããŸããŸããã äžã«è¿œå ããŸãããã
jest-environment-node
ãŸãã¯jest-environment-jsdom-sixteen
ãã¹ããå®è¡ããŸã
ReferenceError: jest is not defined
ããã¯@jest/globals
ãªãããã ãšæããŸã
ã¯ããåè¿°ã®ããã«ãããã¯jest
ãªããžã§ã¯ãã䜿çšããªãå Žåã«ã®ã¿æ©èœããŸãã
ã¢ãã¯ãããããå£ããŠããŸãããããããã¹ãããŠããŸããð
e2eãã¹ããã£ã¬ã¯ããªïŒ e2e/native-esm/__tests__/native-esm.test.js
ïŒãšãã®å·ã«ãããã®ããéåžžã«åºæ¬çãªãããžã§ã¯ããã³ã³ãã€ã«ããŸããã ãããŠæ®å¿µãªãããç§ã¯ãŸã ãããæ©èœãããããšãã§ããŸããð誰ããäžãäžããããã§ãã¯ã§ããŸããïŒ
https://drive.google.com/file/d/1vyDZjsVKOTu6j55QA11GjO9E7kM5WX8_/view?usp=sharing
ãµã³ãã«ã¹ã¯ãªããã®å®è¡ïŒ double
é¢æ°ãã€ã³ããŒãããŠdouble(2)
ïŒïŒ
npm run main
> [email protected] main /Users/ilya/Projects/jest-esm
> node src/main.js
(node:16961) ExperimentalWarning: The ESM module loader is experimental.
4
doubleé¢æ°ã®ãã¹ãã1ã€ã ãå®è¡ããŠjestãå®è¡ããŸãã
npm run test
> [email protected] test /Users/ilya/Projects/jest-esm
> jest
FAIL __tests__/native-esm.test.js
â Test suite failed to run
Jest encountered an unexpected token
This usually means that you are trying to import a file which Jest cannot parse, e.g. it's not plain JavaScript.
By default, if Jest sees a Babel config, it will use that to transform your files, ignoring "node_modules".
Here's what you can do:
⢠To have some of your "node_modules" files transformed, you can specify a custom "transformIgnorePatterns" in your config.
⢠If you need a custom transformation specify a "transform" option in your config.
⢠If you simply want to mock your non-JS modules (e.g. binary assets) you can stub them out with the "moduleNameMapper" config option.
You'll find more details and examples of these config options in the docs:
https://jestjs.io/docs/en/configuration.html
Details:
/Users/ilya/Projects/jest-esm/__tests__/native-esm.test.js:8
import {double} from '../src/index.js';
^^^^^^
SyntaxError: Cannot use import statement outside a module
at Runtime._execModule (node_modules/jest-runtime/build/index.js:1074:58)
Test Suites: 1 failed, 1 total
Tests: 0 total
Snapshots: 0 total
Time: 0.542s
Ran all test suites.
--experimental-vm-modules
ããŒããå®è¡ãã package.json
.mjs
ãŸãã¯"type": "module"
ãšããååãä»ããå¿
èŠããããŸãã
ç·šéïŒããããåŸè ã¯Jestã®å€éšã§æ©èœãããããããŒããžã®å®éšçãªãã©ã°ãæ¬ èœããŠããã ãã§ãã
@SimenBãããããã--experimental-vm-modules
ãš--experimental-modules
ãŸãã äžéšã®ããŒã13ããŒãžã§ã³ããã --experimental-modules
ãäžèŠã§ãããšããäºå®ã«æ··ä¹±ããŸããã ããããšãïŒ
TLDRïŒ node --experimental-vm-modules node_modules/jest/bin/jest.js
ã¯ç§ã®ããã«åããŸã
ãããOPãã
Jestã¯
vm
APIïŒhttps://nodejs.org/api/vm.htmlïŒã䜿çšããå·çæç¹ïŒããŒãv13.6ïŒã§ã¯ããã®APIã®ESMéšåã«ãã©ã°ãä»ããããŠããããšã«æ³šæããŠãã ããïŒ--experimental-vm-modules
ïŒã ãããã£ãŠãESMã«ãã©ã°ãä»ããããŠããªããšèšãã®ã¯ãçŸæç¹ã§ã¯å°ã誀称ã§ãã
ãããããããããªãã®ããã«åãããšã¯çŽ æŽãããã§ãïŒ
ïŒãããã®ã³ã¡ã³ãã解決æžã¿ãšããŠããŒã¯ããŸãïŒ
@SimenBããããšãããããŸãïŒ ç§ããããŸã§ã«èŠãŠãã2ã€ã®åé¡ã
ReferenceError: module is not defined
ã ããç§ã¯ãããæ£ããå®è£ ãããŠããªããããããªããšæã£
importã¹ããŒãã¡ã³ãã¯ESã¢ãžã¥ãŒã«ãŸãã¯CommonJSã¢ãžã¥ãŒã«ãåç §ã§ããŸã
ããã¯ãã¢ããªã®å®è¡æã«æ£åžžã«æ©èœããŸãã CJSããã®ååä»ããšã¯ã¹ããŒãã¯ãcreateRequireã䜿çšããŠã®ã¿ã€ã³ããŒãã§ããŸãããããã©ã«ãã®ãšã¯ã¹ããŒãã¯ã€ã³ããŒãããã ãã§ãã
äžèšã®ãšã©ãŒãçºçããŠããªãå Žåã¯ã次ã®ãšã©ãŒãçºçããŠããŸãã
TypeError: _vm(...).SyntheticModule is not a constructor
at Runtime._importCoreModule (node_modules/jest-runtime/build/index.js:1198:12)
targets: { node: 12 }
ãš2ã€ã®ãã©ã°ã€ã³ãåããææ°ã®BabelïŒ babel-plugin-transform-import-meta
ãšrewire-exports
ã ïŒ import-meta
ãã©ã°ã€ã³ãåé€ããããšããŸããããè¿œå ãçŽãããã«ãšãããšã©ãŒãçºçããŸãããïŒtestEnvironment: "node"
ã¯ã»ãšãã©å¯äžã®èšå®ã§ãnode --experimental-vm-modules node_modules/jest/bin/jest.js
è€è£œã¬ãã圹ç«ã€å Žåã¯ãç§ã«ç¥ãããŠãã ããã
ããããšã@aldeedïŒ
åé¡1ã調ã¹ãŸãããããã¯ç¢ºãã«ãã°ã®ããã§ãã ç·šéïŒïŒ9850ã§ä¿®æ£ããå¿ èŠããããŸã
åé¡2ã«ã¯ããŒã12.16.0ãå¿ èŠã§ãïŒ https ïŒ//nodejs.org/docs/latest-v12.x/ââapi/vm.html#vm_class_vm_syntheticmodule
Jestã®ãã§ãã¯ãå€æŽããŸãïŒçŸåšãããå€ãã®ããŒãžã§ã³ã§å©çšå¯èœãªvm.SourceTextModule
ããã§ãã¯ããŸããã SyntheticModule
ãå¿
èŠã§ãïŒã
12.16.0ã§å®è¡ãããšãåé¡2ãä¿®æ£ãããããšã確èªããŸãããä¿®æ£ããªãªãŒã¹ãããåŸãåé¡1ãåãã¹ãããŸãã ãã以å€ã®å Žåã¯ã jest
ãªããžã§ã¯ããããã«ãã¹ããããã®ãåŸ
ã£ãŠãããã€ã³ããŒãããå¿
èŠãããããšã«åæããŸãã
çŽ æŽãããä»äºã@ SimonBïŒ å°ããªãããžã§ã¯ãã§ãããè©ŠããŠããŸãããåçã€ã³ããŒãã§åé¡ãçºçããŸããã ããã¯ç§ãèŠãŠãããšã©ãŒã§ãïŒ
Module status must not be unlinked or linkingError [ERR_VM_MODULE_STATUS]: Module status must not be unlinked or linking
åçã€ã³ããŒããåé€ãããšããã¹ããå®è¡ãããŸãïŒãã ãããã¡ãããä»ã®çç±ã§å€±æããŸãïŒã åããã¹ããçŸåšMochaïŒESMãµããŒããããªãæè¿åºè·ããïŒã§æ©èœããŠããŸãã
ããã圹ç«ã€å Žåã¯ãåé¡ã®åçã€ã³ããŒããããã§ç¢ºèªã§ããŸãïŒ https ïŒ
ãã¹ããã¡ã€ã«ã¯ããã«ãããŸãïŒ https ïŒ
ä»ã«åœ¹ç«ã€æ å ±ãããã°æããŠãã ããã
ããããšã@beejunkïŒ å®å
šã«ãªã³ã¯ãããåã«åãã¢ãžã¥ãŒã«ãã€ã³ããŒãããimport
ã®éã«ç«¶åç¶æ
ãçºçããå¯èœæ§ãããã®ã§ã¯ãªãããšæã£ãŠããŸããã ããã¯ããªããããã§æã€ãã®ã®ããã«_æããã_ã ä»æ¥ã¯ãããä¿®æ£ããŸããã¬ããŒãã«æè¬ããŸãïŒ
ç·šéïŒïŒ9858ã§ä¿®æ£ãããŸããã ä¿®æ£ããªããžããªã«ã³ããŒããŸããïŒ
誰ãããããTypeScriptã§åäœãããããšãã§ããŸãããïŒ node --experimental-vm-modules node_modules/jest/bin/jest.js
åãè¿ããŸãSyntaxError: Cannot use import statement outside a module
ç§ã«ããããããã package.json
æã£ãŠããŸã"type": "module"
ã
babel.config.cjs
module.exports = {
presets: [
'@babel/preset-typescript',
],
};
jest.config.cjs
module.exports = {
testEnvironment: 'jest-environment-node',
transform: {},
};
@dandvããªãã¯æ¬è³ªçã«ãã®ã±ãŒã¹ã«ã¶ã€ãã£ãŠããŸãïŒ https ïŒ
å¥ã®åé¡ãéããŠããããŸããïŒ js以å€ã®æ¡åŒµæ©èœãã©ãããããç解ããå¿ èŠããããŸã
@SimenB ïŒïŒ9860ã ã芧ããã ãããããšãããããŸãã
@aldeed @beejunk 25.5.0ããªãªãŒã¹ãããåé¡ãä¿®æ£ãããŸããã ãã°ã¬ããŒããä»åŸãç¶ããŠãã ããð
ãããããã«å ããŠããããåŸ
ã£ãŠãã人ã®ããã®import { jest } from '@jest/globals'
ãµããŒããå«ãŸããŠããŸãð
@SimenBããããã®ãã¹ãŠã«è¿ éã«åãçµãã§ããã ãããããšãããããŸãã ç§ã¯å¥ã®åé¡ã«ééãããšæããŸãã
éçºãµãŒããŒã§ã¢ãžã¥ãŒã«ãã£ãã·ã¥ãç¡å¹ã«ããæ¹æ³ãšããŠãã€ã³ããŒããã¹ã§ã¯ãšãªãã©ã¡ãŒã¿ã䜿çšããŠå®éšããŠããŸããã ã¢ã€ãã¢ã¯ãã³ã³ããŒãã³ãã®å€æŽãæ€åºããä»»æã®ã¯ãšãªãã©ã¡ãŒã¿ã§ã€ã³ããŒããã¹ãæŽæ°ãããã¡ã€ã«ãŠã©ããã£ãŒã䜿çšããŠããµãŒããŒãåèµ·åããã«æ¬¡ã®ããŒãžã®èªã¿èŸŒã¿æã«æ°ããã³ãŒããããã«åã蟌ãŸããããã«ããããšã§ãã ããã¯ãéçºãµãŒããŒãå®è¡ããŠãããšãã«æ©èœããŸãã ãã ããJestã¯æ¬¡ã®ãšã©ãŒãã¹ããŒããŠããŸãã
Cannot find module '/path/to/project/components/BasePage.js?cache=0' from 'renderPage.js'
ã¯ãšãªãã©ã¡ãŒã¿ã䜿çšãããŠããå Žæã®äŸã次ã«ç€ºããŸããhttpsïŒ
ã¯ãšãªãã©ã¡ãŒã¿ãåé€ãããšãäžè²«æ§ã¯ãããŸãããããã¹ãã«åæ ŒããŸãã åäžã®ã¹ã€ãŒãïŒããšãã°ã npm test -- test/build.test.js
ïŒãå®è¡ãããšããã¹ãã¯æåããŸããããã¹ãŠã®ãã¹ããäžåºŠã«å®è¡ãããšãã»ãšãã©ã®å ŽåããããŸããªãšã©ãŒã§å€±æããŸãã äžè²«æ§ã®ãªããã¹ãã®åé¡ã«ã€ããŠã¯ãŸã 調æ»äžã§ãããæåã«ã¯ãšãªãã©ã¡ãŒã¿ã®åé¡ã«ã€ããŠå ±åãããšæããŸããã
ã¬ããŒã@beejunkãããããšãã ïŒ6282ã¯ãããåŠçããããšã«ãªã£ãŠããŸãããããã§ã¯å¿ èŠã®ãªããã©ã³ã¹ãã©ãŒããŒãªã©ã«ãã¯ãšãªãæž¡ããããšèããŠããŸãã ãããã£ãŠãä»ã®ãšããã©ã³ã¿ã€ã ã§ã¯ãšãªãå éšçã«ãµããŒãããïŒ6282ã«ãã®ã¯ãšãªã®åãæž¡ããåŠçãããã®ã¯çã«ããªã£ãŠãããããããŸããã
ã¢ãžã¥ãŒã«ãã£ãã·ã¥ãã¯ãšãªããšã«å€ããããã®ã³ãŒããå°ãè¿œå ããŸããïŒ https ïŒ
ããããã¯ãšãªã§ãããåŒã³åºãã³ãŒãã¯ãããŸããã resolvePath.split('?')
ã ãã§ã§ããã¯ãã§ããã¹ãŠããŸãããã¯ãã§ãã
äžè²«æ§ã®ãªããšã©ãŒã«ã€ããŠã¯ããã®ãªããžããªããããåçŸãããã©ããã確èªããŸãã ESMã³ãŒãã䞊è¡ããŠãã¹ãããããšã¯ãªãããã¹ãã¯1ã€ã ãã§ãã ãªããããç©äºã«åœ±é¿ãäžããã®ãããããŸãããã誰ãç¥ã£ãŠããŸããð
@beejunkã¯ãšãªã¯25.5.1ã§ä¿®æ£ãããŸããã ç§ã¯ãŸã ä»ã®åé¡ã調æ»ããæéããããŸããã§ãã
ããã«é¢é£ããŠãããšæãããåé¡ããããŸããã 25.X
ä¿®æ£ãããŸãã
以äžã®ã·ããªãªãèŠçŽããŠã¿ãŸãã
{ default: generator } = require(path.resolve(f))
f
å
ã®ãã¹ãŠããã©ã³ã¹ãã€ã«ãããªãããããäºæããªãèå¥åã®ã€ã³ããŒããšã©ãŒããçºçããŸããããã¯ãimportïŒïŒãè©ŠããŠã¿ãå Žåã«ãçºçããŸã
ããªãããã©ã³ã¹ãã€ã«ã«ã€ããŠèšåããŠããã®ã§; import
ããrequire
ãã©ã³ã¹ãã€ã«ããã»ããã¢ãããããå Žåããã®åé¡ã¯æ£ããå Žæã§ã¯ãããŸãã-ãã®åé¡ã¯ãã€ãã£ããµããŒãã«é¢ãããã®ã§ãã
ããã¯èšã£ãŠããESMãrequire
ããšã¯ã§ããŸããããŸããããŒãã«APIããªããããCJSããimport()
ãµããŒããè¿œå ããããšã¯ã§ããŸããã ãã®ãµããŒãã¯ããŒããã¹ã¿ãŒã«å°éããŸãããããŸã ãªãªãŒã¹ãããŠããŸããïŒ https ïŒ
ãã ãã .mjs
ã»ããã¢ãããã¡ã€ã«ã䜿çšã§ããã¯ãã§ãã
@SimenBããã¯çŽ æŽãããããšã§ããçŸåšãããã€ãã®ãã¹ããã¡ã€ã«ã§æ©èœããŠããããã§ãã åãã¡ã€ã«ã®Babelã€ã³ããŒããšNodeã€ã³ããŒãã®éãã解決ããããjestã€ã³ããŒããè¿œå ãããããã®ã¯å°ãããã»ã¹ãªã®ã§ãäœçŸãã®ãã¹ããã¡ã€ã«ã§è¡ããšããã«å€ãã®åé¡ãçºçããå¯èœæ§ããããŸãã
ããå€ãã®è³ªåã§ããããã€ãã®ããšïŒ
import()
ãµããŒãã«ã€ããŠã®ä»¥åã®ã³ã¡ã³ãã§ããªããèšã£ãããšã¯ãJestæ§æãã¡ã€ã«ã«jest.config.js
ãšããååãä»ããããšãã§ããŸããïŒ ååã®ãšãã«ã¯çŸåšãç§ã®äœåjest.config.cjs
ããŠäœ¿çšããŠmodule.exports =
ïŒãšã©ãŒãããTypeError [ERR_VM_DYNAMIC_IMPORT_CALLBACK_MISSING]: A dynamic import callback was not specified
ïŒpackage-lock
ãªã¹ããããŠããããã±ãŒãžã§ã¯ãªããããeslintã«ãŒã«node/no-extraneous-import
倱æããŸãã ãã®åœåèŠåã«ã¯äœããã®çç±ããããŸããïŒ äœ¿çšããããšãå¯èœã§ãjest
ããã«@
ïŒ ã«ãŒã«ãç¡èŠããã®ã¯ç°¡åã§ãããç§ã¯ãã çåã«æã£ãŠããŸããjest
ã°ããŒãã«ãtest
ã describe
ã before
ãªã©ã®éæ³ã®fnsãšç°ãªãã®ã¯ãªãã§ããïŒ ãããããã¹ãŠä»ããã€ã³ããŒãããå¿
èŠããããŸããïŒ--experimental-vm-modules
ãã©ã°ãèšå®ã§ããããã«ãªããŸããïŒ jest
ã³ãã³ãã ãã§æ©èœããªãå Žåãããã¯äžçš®ã®éæšæºã®ããã«èŠããŸãã ãã©ã°ãçŽæ¥æž¡ãããšãã§ããªãå Žåã¯ã NODE_OPTIONS
envå€æ°ãèšå®/ä¿®æ£ã§ããŸããïŒããã«ãããJestæ§æãã¡ã€ã«ã«jest.config.jsãšããååãä»ããããšãã§ããŸããïŒ
æãè¿ãpackage.json
ã«type: 'module'
å Žåã¯ã .js
ãšããååã.mjs
ãšããååãä»ããå¿
èŠããããŸãã https://nodejs.org/api/esm.html#esm_enablingãåç
§ããŠawait
ããã®ã¯ç°¡åã§ããPRãæè¿ããŸãðïŒ8357ã¯åæ¢ããŠããŸãã
A dynamic import callback was not specified
ãååŸããããšã«éåžžã«é©ããŠããŸãããVMã«æ§æãã¡ã€ã«ãããŒãããŠããŸãã...å¥ã®åé¡ãéããŠããã ããŸãããïŒ
ã@jest / globalsããšããååã¯ã
package-lock
ãªã¹ããããŠããããã±ãŒãžã§ã¯ãªããããeslintã«ãŒã«node/no-extraneous-import
倱æããŸãã ãã®åœåèŠåã«ã¯äœããã®çç±ããããŸããïŒ@
ãªãã§jest
ã䜿çšããããšã¯å¯èœã§ããïŒ ã«ãŒã«ãç¡èŠããã®ã¯ç°¡åã§ãããç§ã¯ãã çåã«æã£ãŠããŸãã
@jest/globals
devDependency
ãè¿œå ããå¿
èŠããããŸãã ããã±ãŒãžèªäœã¯ãåå®çŸ©ã®ã¿ã§ãã ããã¯jest
ã¯å¥ã®ããã±ãŒãžã§ãããããåå®çŸ©ãæ£ããæ©èœããJestã©ã³ã¿ã€ã ã®å€éšã«ããŒããããå Žåã«ãšã©ãŒãã¹ããŒããå¯èœæ§ããããŸãã
çŸåšããããå€æŽããäºå®ã¯ãããŸãããããã®ããã±ãŒãžãå»æ¢ããŠãã¿ã€ããjest
ãããšã¯ã¹ããŒãããå¯èœæ§ããããŸãã ããããããã¯å€§ããªé倧ãªå€æŽãªã®ã§ãåŸã§èŠãŠã¿ãŸãããð
é¢é£ãã質åã
jest
ã°ããŒãã«ãtest
ãdescribe
ãbefore
ãªã©ã®éæ³ã®fnsãšç°ãªãã®ã¯ãªãã§ããïŒ ãããããã¹ãŠä»ããã€ã³ããŒãããå¿ èŠããããŸããïŒ
jest
ã¯ãCJSã®require
ãŸãã¯module
ãªããžã§ã¯ãã«äŒŒãŠããããã¡ã€ã«ããšã«äžæã§ãããå®éã«ã¯ã°ããŒãã«ã§ã¯ãããŸããïŒã€ãŸãã globalThis.jest === undefined
ïŒã ããã«ããã jest.mock('../../file.js')
ãªã©ããæ¿å
¥ããããã¡ã€ã«ã«å¯ŸããŠæ£ããæ©èœããããã«ãªããŸããå®éã®ã°ããŒãã«ãã€ã³ããŒãããããšãã§ããŸããã globalThis.expect
ãªã©ãšããŠåŒãç¶ã䜿çšã§ããŸãã
ãããå®äºãããšãJestã
--experimental-vm-modules
ãã©ã°ãèšå®ã§ããããã«ãªããŸããïŒ
ããŒãããµã€ã¬ã³ãã«èšå®ããã®ã§ã¯ãªãããã©ã°ã解é€ãããã®ãåŸ
ã€ãšæããŸããäœããã®çç±ã§ãã©ã°ãä»ããããŠãããããAPIããã€ãå€æŽãããå¯èœæ§ããããŸãã NODE_OPTIONS
ãèšå®ãããªãã·ã§ã³ãè¿œå ã§ããŸããããããçŸåšã®ã©ã³ã¿ã€ã ãå€æŽãããã©ããã¯ããããŸãããïŒ ãšã«ãããçŸåšã®èšç»ã¯ãããŸããã
å€ãããŒãã§ãããè©ŠããŠã¿ããšã以åãšã¯å°ãç°ãªããšã©ãŒãçºçããããã§ãããã©ã¡ãã®ãšã©ãŒããããŒãã®æå°ããŒãžã§ã³ãåé¡ã§ãããšããããšã¯æããã§ã¯ãããŸããã§ããã ãã圹ç«ã€ãšã©ãŒã¡ãã»ãŒãžãå«ãæå°ããŒãžã§ã³ã®ãã§ãã¯ãè¿œå ããã®ã¯ç°¡åã§ããïŒ
ãããå®è£ ãå°ãå®å®ããããããã€ãã®ããã¥ã¡ã³ããšäžç·ã«ãããè¯ããšã©ãŒã¡ãã»ãŒãžãè¿œå ããŸãã å®è£ ã¯å®éšçãªãã©ã°ã«ãã£ãŠå®ãããŠããã®ã§ã誰ãããã«ã€ãŸãããšã¯æããŸããã
@ SimenB ãJestã25.5.2ã«æŽæ°ããŸãããããã¹ãŠã®ãã¹ãã«åæ ŒããŠããŸãã ã¯ãšãªãã©ã¡ãŒã¿ã¯æ©èœããŠããã以åã«èŠãæç¶çãªãšã©ãŒã¯çºçããªããªããŸããã ãã€ããäžè©±ã«ãªã£ãŠãããŸãïŒ
ããŠãæåŸã®ãã¹ãã®å®è¡ã§ãšã©ãŒãåã³è¡šç€ºãããã®ã§ãããã¯ãŸã çºçããŠããŸãã äžè²«ããŠåçŸããŠå ±åããæ¹æ³ãèŠã€ãããããã©ããã確èªããŸãã
åé¡ãåçŸããããã®äžè²«ããæ¹æ³ãèŠã€ãããšæããŸãã ãããç§ãåããŠãããã©ã³ãã§ãïŒ https ïŒ
åçŸããã«ã¯ïŒ
/tmp/jest_rs
æåã§åé€ããŸãããnpm test
3åå®è¡ããŸãã æåã®2åã®å®è¡ã¯æåããã¯ãã§ãã ãã ãã3åç®ã®å®è¡ã¯å€±æããã¯ãã§ããããã¯ããšã©ãŒãçºçãããšãã«è¡šç€ºãããã¹ã¿ãã¯ãã¬ãŒã¹ã§ãã
Error:
at invariant (/home/brian/Projects/firn.js/node_modules/jest-runtime/build/index.js:1866:11)
at Runtime.loadEsmModule (/home/brian/Projects/firn.js/node_modules/jest-runtime/build/index.js:480:7)
at Runtime.linkModules (/home/brian/Projects/firn.js/node_modules/jest-runtime/build/index.js:548:19)
at importModuleDynamicallyWrapper (internal/vm/module.js:397:21)
at htmPreactPath (internal/process/esm_loader.js:31:14)
at renderPage (/home/brian/Projects/firn.js/lib/renderPage.js:53:15)
at map (/home/brian/Projects/firn.js/lib/build.js:43:12)
at Array.map (<anonymous>)
at build (/home/brian/Projects/firn.js/lib/build.js:36:43)
at Object.<anonymous> (/home/brian/Projects/firn.js/test/build.test.js:57:5)
ãšã©ãŒã¯åçã€ã³ããŒãã«èµ·å ããŠããããã§ãã ãšã©ãŒã¡ãã»ãŒãžããªãã®ã§ãäœãèµ·ãã£ãŠããã®ãå®å šã«ã¯ããããŸããã
è¿œèšïŒJestãã£ãã·ã¥ãã¯ãªã¢ãã --no-cache
è¿œå ããŠãã¹ãã¹ã¯ãªãããæŽæ°ãããšãåé¡ãåçŸã§ããªããªããŸãã
ãããç§ã¯ããã§æ æ°ã§ãé©åãªãšã©ãŒã¡ãã»ãŒãžãæäŸããŸããã§ããã åé¡ã¯ããã¹ãç°å¢ãåãå£ãããŠããããšã§ãããã®ãããã©ããã«await
æ¬ èœããŠãããšæããŸãã ãã ããã³ãŒãã調ã¹ãŠãããã®ã¯äœã衚瀺ãããªãã£ãã®ã§ãããå°ãæãäžããå¿
èŠããããŸã
@SimenBããã¯ããã®ESMæ§æã®åé¡ã®è€è£œã§ãïŒ https ïŒ
@SimenBåçã€ã³ããŒãã䜿çšãããšãã«äžèšã®Jestãšã©ãŒãåçŸããããã®æå°éã®äŸãäœæããŸããã
çŽ æŽãããè€è£œ@beejunkãããããšãïŒ ãããJestã®ãã°ãªã®ããNodeã®ãã°ãªã®ããå®éã«ç解ããããšãªããããã§èªããããšæãæéããã£ãšè²»ãããŸããã ããŒãã³ã¢ã¢ãžã¥ãŒã«ã®ã¿ã䜿çšããŠåäœãåçŸããã¢ããã¹ããªãŒã ã§å ±åããã®ã§ããããã®å 容ãèŠãŠã¿ãŸãããïŒ https ïŒ
調ã¹ãŠãããŠããããšãã@ SimenBã --no-cache
ãã©ã°ãè¿œå ãããšããã¹ãã¯äžè²«ããŠåæ Œããããã«èŠããŸããããã¯ãç§ã®ãŠãŒã¹ã±ãŒã¹ã«ã¯åé¡ãã
ãããç§ãããã«æ°ã¥ããŸããã ããã¯ããçš®ã®ã¿ã€ãã³ã°ã®åé¡ã ãšæããŸãããã£ãã·ã¥ããªããšãåäœããã®ã«ååãªé床ãäœäžããŸãã
@ SimenB ïŒ9935ã解決ããŠããã ãããããšãããããŸãã ç§ã¯ããã§2çªç®ã®æžå¿µã«ã€ããŠèšåããŸããããããã¯ãŸã æå¹ã ãšæããŸãã type: "module"
å Žåã§ãã jest --init
ã¯module.exports
ãå«ãæ§æãã¡ã€ã«ãçæããŠããŸãã èªåãäœãããŠããã®ããããã£ãŠããå Žåããããæåã§å€æŽããã®ã¯æ¯èŒçç°¡åã§ãããããŒãã§ESMã®ãã©ã°ãç«ãŠãããŠããããå€ãã®äººãESMãããžã§ã¯ããéå§ãããšãçŽãããããã°ã®ããã«èŠãå§ããŸãïŒã€ãŸããæ°ããESMãããžã§ã¯ãã®jest --init && jest
ã¯ãšã©ãŒãã¹ããŒããŸãïŒã ç¹ã«initããžãã¯ã®æ¹åã«ã€ããŠå¥ã®åé¡ãæåºããå¿
èŠããããŸããïŒ
@aldeedããããã§ããïŒ ä»ãããã¹ããããšã export default
ãå«ãmjs
ãã¡ã€ã«ãåŸãããŸãã mjs
ã§ã¯ãªãjs
ãçæã§ãããšæããŸãããããã§ãã§ãã ESMæ§æã䜿çšããŸã
@SimenBãããšãããªããå°ãããŸã§ç§ã¯ç¢ºä¿¡ããŠããŸããã ðç§ã¯ãããè©ŠããŸããããããŠããªãã¯æ£ããã§ãã ãã¶ãç§ã¯æåã«å€ãããŒãžã§ã³ã®NodeãŸãã¯Jestã§ãããããŸãããïŒ ç¡èŠã
ããã¯ãããïŒ ç§ã®ã©ã€ãã©ãªã®1ã€ã§ãã¹ããäœãçŽããŠãESã¢ãžã¥ãŒã«ã䜿çšããããã«ãæšãŠãŸããã ããããšã@SimenBïŒ
ãã¡ã€ã«ãESMã¢ãŒããCJSã¢ãŒãããæ€åºããŸã
ããã«ã€ããŠèšãã°ãESã¢ãžã¥ãŒã«ã®ãšã¯ã¹ããŒãã瀺ãããã«"module":"<path to es module>"
æ§æã䜿çšãããã©ãŠã¶/ãã³ãã©ãŒæåã®ããã±ãŒãžããããããããŸãã ããã±ãŒãžèªäœã®èšå®ã«é¢ä¿ãªããç¹å®ã®ããã±ãŒãžã解決ããæ¹æ³ãæå®ããæ¹æ³ããããšè³¢æãªå ŽåããããŸãã moduleNameMapper
ãããªãã®ã§ãããCJSãESMããæå®ããŸãã
ããã«ã¡ã¯@SimenB ããã®åé¡ã解決ããããšã ts-jest
ãcommonjs
匷å¶è§£é€ã§ããããšãæå³ããŸããïŒ esmã§åäœããããã«ãã©ã³ã¹ãã©ãŒããŒåŽããå€æŽããã«ã¯ãã¡ã€ã«æ¡åŒµåãå¿
èŠã§ããïŒ
ä»äŸãã°ts-jest
ã³ã³ãã€ã«ts
ã«js
ã®ããã«commonjs
ããªãesm
å¿
èŠãšãããã¡ã€ã«ã®æ¡åŒµåmjs
ããã³ã³ãã€ã«æts
ããjs
ïŒ
@zandaqo modules
ãã£ãŒã«ãã¯ãµããŒããããŸãããããŒãã®ä»æ§ã«åŸãã exports
ïŒïŒ9771ã䜿çšããŸãã ãã ããå¿
èŠã«å¿ããŠãç¬èªã®ãªãŸã«ããŒããã©ã°ã€ã³ããŠmodules
ããµããŒãã§ããŸãïŒ https ïŒ//jestjs.io/docs/en/configuration#resolver-stringã ä»ã®ãªãã·ã§ã³ïŒ mainFields
ãwebpackã®ããã«ïŒïŒãè¿œå ããããšãã§ããŸãããå®è£
ãå®å®ããæªç¥æ°ãå°ãªããªããšãããã«å
ã«é²ã¿ãŸãð
@ ahnpnl ïŒ9860
ãã£ãªã¿ããªïŒ
質åã§ããããã°æçš¿ã«ã¯ãES6ã¢ãžã¥ãŒã«ã¯éçã§ãããããã¢ãã¯ããããšã¯ã§ããªããšèšèŒãããŠããŸãã ããã§ãå®éã«ã¯ãES6ã®ã¢ãžã¥ãŒã«Bã«ãã£ãŠã€ã³ããŒããããã¢ãžã¥ãŒã«Aãã¢ãã¯ããæ¹æ³ã¯ãããŸãããïŒ
@gabrieledarrigoãã®ããã«moduleNameMapper
ã䜿çšããŸããäŸïŒ
"moduleNameMapper": {
"moduleA": "<rootDir>/test/moduleA-mock.js"
},
@gabrieledarrigoããªããã§ãã
jest.mock('the-thing-i-want-to-mock', () => /* do whatever in here */);
let importedThing;
beforeAll(async () => {
importedThing = await import('thing-that-imports-mocked-module');
});
ãããã£ãŠãã€ã³ããŒããééçã«ããå¿ èŠããããã¢ãã¯ãæ©èœããŸãã
ESMã³ãŒããã¹ã«ã¢ãã¯è§£å床ããŸã é ç·ããŠããªããããçŸåšã¯æ©èœãããã©ããã¯ããããŸããã ãã€ãããããã§ãããã ããããããã¯_ãããã_ãã€ãã£ãESMã®ã¢ãžã¥ãŒã«ã¢ãã¯ãææžåããæ¹æ³ã«ãªãã§ãããã
ããã°ãããã§è¿°ã¹ãããã«ãç§ãã¡ã¯ãã€ããããã®ãã¿ãŒã³ãææžåããã§ããããç§ãã¡ã¯ããããç解ããå¿ èŠããããŸãð
ç§ãã¡ãæã£ãŠããã¢ã€ãã¢ã®1ã€ã¯ããããã¬ãã«ã®åŸ æ©ãåŸ ã€ããšã§ããããã®åŸãbabelãã©ã°ã€ã³ã䜿çšããŠãããè¡ãããšãã§ããŸããã
@SimenBãŸã第äžã«ãããã§çŽ æŽãããä»äºãããããšã:)
jest-environment-node
ããæ¡åŒµãããcustomEnvironmentãäœæããããšãã«ãå®éã«åé¡ã«çŽé¢ããŸãã esmãšããŠèšè¿°ãããŠãããµãŒããŒå®è£
ãããã«ã€ã³ããŒãããå¿
èŠããããŸãã ããããç°å¢ã¯cjs
ãšããŠå®çŸ©ããå¿
èŠãããããã§ãã
ç§ã®è³ªåã¯ããµãŒããŒã¢ãžã¥ãŒã«ãã€ã³ããŒãã§ããããã«ã«ã¹ã¿ã testEnvironmentãesmãšããŠå®çŸ©ãããªãã·ã§ã³ã¯ãããŸããïŒ ã¢ããã€ã¹ããããšãããããŸãã
@ kuka-radovanã¯ããã®ããã®å¥ã®æ©èœãªã¯ãšã¹ããéãããšãã§ããŸããïŒ
æŽæ°ïŒãã®åé¡ã¯https://github.com/facebook/jest/issues/10025ã§è¿œè·¡ãããããã«ãªããŸãã
@SimenBäžèšã®jest.mock
ã¢ããã€ã¹ãããããšãã ããŸããŸãç§ã¯ä»æ¥ãããå¿
èŠãšããããã€ãã®ãã¡ã€ã«ãå€æããŠããŸãã ã¢ãã¯ãããã¢ãžã¥ãŒã«ãnode_modules
ããã±ãŒãžã®å Žåãããªãã®äŸã¯æ©èœããããšã確èªã§ããŸãããåããããžã§ã¯ãã®ã¢ãžã¥ãŒã«ãã¢ãã¯ããå Žåã¯æ©èœããŸããã
ç°¡åãªäŸã次ã«ç€ºããŸãã
// main.js
import secondary from "./secondary.js";
export default function main() {
return secondary();
}
// secondary.js
export default function secondary() {
return true;
}
// test.js
import { jest } from "@jest/globals";
jest.mock("./secondary.js");
let main;
let secondary;
beforeAll(async () => {
({ default: main } = await import("./main.js"));
({ default: secondary } = await import("./secondary.js"));
});
test("works", () => {
secondary.mockReturnValueOnce(false); // TypeError: Cannot read property 'mockReturnValueOnce' of undefined
expect(main()).toBe(false);
});
代ããã«"./secondary.js"
ãããã±ãŒãžåã®å ŽåããŸã£ããåããã¿ãŒã³ãæ©èœããŸãã ïŒç§ãè©Šããããã±ãŒãžã¯ããããéèŠãªå ŽåãCommonJSããšã¯ã¹ããŒããããšæããŸããïŒ
Jest 26.0.1 w /ããŒã12.16.3
äœãã¢ã€ãã¢ããããŸããããããšãå®å šã«å¥ã®åé¡ãæåºããå¿ èŠããããŸããïŒ
ç·šéïŒæ§æã«transform: {}
ãªã®ã§ãBabelã¯ãŸã£ãããããŸãã
ç·šé2ïŒãããæ©èœããŸããïŒ
jest.mock("./secondary.js", () => ({
default: jest.fn()
}));
ããã«é¢ããçŽ æŽãããä»äºã
ãã ããäœãééã£ãããšãããªãéããCJSãã¹ããã¡ã€ã«ã§import()
ã䜿çšããããšã¯ãŸã å¯èœã§ã¯ãªãããã§ãã
ç§ã¯åè«ãå®è¡ããŠããnode --experimental-vm-modules node_modules/jest/bin/jest.js
ãšæã£ãŠããtestEnvironment: 'node', transform: {}
ã§jest.config.js
ã ããã¯ããŒã14.2.0ã«ãããŸãã
ã€ã³ããŒãåŒã¯ãšã©ãŒãçæããŸãïŒ
TypeError [ERR_VM_DYNAMIC_IMPORT_CALLBACK_MISSING]:
A dynamic import callback was not specified.
ããã¯çŸåšãæ¢ç¥ã®å¶éã§ããïŒ https://github.com/nodejs/node/pull/32985ãããŒã14.1.0ã«å°éããããã§ãã
ãããç§ã¯ãŸã ãããå®è£ ããããšã«ãªã£ãŠããŸããã ããããä»é±æ«ã«çéžããã§ãããã
@aldeedå¥ã®åé¡ãéãããšãã§ããŸããïŒ ã¢ãã¯ã解決çã®äžéšã§ããããšã確èªããå¿ èŠããããŸããããªãã®äŸã¯è¯ããã¹ãã±ãŒã¹ã®ããã§ãð
@SimenBè¿ éãªè¿ä¿¡ããããšãããããŸãã çéžãããšãã¯æ°ãã€ããŠãããŸãã
ã¹ã¯ãªããã®import
ããªã°ã¬ãã·ã§ã³ïŒhttps://github.com/nodejs/node/issues/33166ïŒã®ããã«å
ã«æ»ãããå¯èœæ§ããããããããã解決ãããŸã§ä¿çããŸããã
.mjs
ãã¹ããã¡ã€ã«ã§ããã䜿çšããããšãããšåé¡ãçºçããŸãã __tests__/my-test.mjs
ãæã£ãŠããå Žåã
$ yarn test
yarn run v1.22.4
$ node --experimental-vm-modules node_modules/jest/bin/jest.js
No tests found, exiting with code 1
Run with `--passWithNoTests` to exit with code 0
In C:\Users\Domenic\Dropbox\Programming\WIP\remember-to-eat
1 file checked.
testMatch: **/__tests__/**/*.[jt]s?(x), **/?(*.)+(spec|test).[tj]s?(x) - 0 matches
testPathIgnorePatterns: \\node_modules\\ - 1 match
testRegex: - 0 matches
Pattern: - 0 matches
error Command failed with exit code 1.
è¿œå ããå Žå
"testMatch": ["**/__tests__/**/*.mjs"]
ç§ã®package.jsonã«ãç§ã¯
$ yarn test
yarn run v1.22.4
$ node --experimental-vm-modules node_modules/jest/bin/jest.js
No tests found, exiting with code 1
Run with `--passWithNoTests` to exit with code 0
In C:\Users\Domenic\Dropbox\Programming\WIP\remember-to-eat
1 file checked.
testMatch: **/__tests__/**/*.mjs - 0 matches
testPathIgnorePatterns: \\node_modules\\ - 1 match
testRegex: - 0 matches
Pattern: - 0 matches
error Command failed with exit code 1.
ãã ãã "testMatch"
ãåé€ããŠããããã¡ã€ã«ã®ååã__tests__/my-test.js
ã«å€æŽãããšãæ©èœããŸãã
ãããžã§ã¯ãã§.mjsæ¡åŒµåãäžè²«ããŠäœ¿çšã§ããããã«ããããšæããŸãã Jestã§ããã¯å¯èœã§ããïŒ
@domenicç§ãããã«ééããŸããã 解決çã¯ãïŒ "testMatch"
ã«å ããŠïŒæ§æã«"moduleFileExtensions": ["js", "mjs"]
ãè¿œå ããããšã§ãã
èŠãŠã¿ããšã moduleFileExtensions
ã¯ç¢ºãã«å¿
èŠã§ãã
Jestã¯ãããã§hasteFS.getAllFiles()
å®è¡ããããšã«ããããããžã§ã¯ãå
ã®ãã¹ãŠã®ãã¡ã€ã«ã®ãªã¹ããååŸããŸãã
hasteFS
ã¯ã次ã®extensions
æ§æã䜿çšããŠHasteMap
äžéšãšããŠäœæãããŸãã
ãã ãããã®å Žåã¯moduleFileExtensions
ãæå®ããå¿
èŠã¯ãªããšæããŸãã ãã§ã«.snap
ã匷å¶çã«æ€åºããŠããŸãããããç¥ãããŠããJSæ¡åŒµæ©èœã匷å¶çã«æ€åºããå¿
èŠããããŸããïŒ ãããã¯ïŒé ã®ãŠã£ãºãããïŒ js
ã mjs
ã cjs
ã jsx
ã ts
ã tsx
ïŒ ã¯ããŒã«ãé
ããªããŸããã倧ããªåœ±é¿ã¯ãªããšæããŸãã ç§ã¯ééã£ãŠãããããããŸãããïŒ ããã©ã«ãã§ã¯ã cjs
ãšmjs
ãããã©ã«ãã®ãã¿ãŒã³ã®äžéšã§ã¯ãªããããããã»ã©é
ããªãããšã¯ãããŸããããã«ã¹ã¿ã ãã¿ãŒã³ã䜿çšããŠããå Žåã¯ãé床ãäœäžããå¯èœæ§ããããŸãã
ãããå°ãªããšãESã¢ãžã¥ãŒã«ã¢ãŒãã§ãmoduleFileExtensionsãè¿œå ããããããã©ã«ãã®testMatchãå€æŽãããããã«ã.mjsãæ©èœããã®ãçæ³çã§ãã
.jsãã¡ã€ã«ãé€å€ã§ããã°ããã®ã§ããã ãã£ãŠã¿ãã
Validation Error:
moduleFileExtensions must include 'js':
but instead received:
["mjs"]
Please change your configuration to include 'js'.
ããŒãã®esmãã¡ã€ã«æ¡åŒµåãè¿œå ããesmã䜿çšããŠãªããã€ã³ããããã®ã³ã³ãã€ã«ããjsã«åœ¹ç«ã€ãESMã¢ãŒããã䜿çšããã®ãçã«ããªã£ãŠããã®ã§ã¯ãªãããšæããŸãïŒïŒ9860ïŒã
js
ãªããšããµã³ãããã¯ã¹å
ã«ããŒããããã®ãå
éšçã«å£ããŸãïŒåãrequire
å®è£
ãªã©ã䜿çšããããïŒã ãŠãŒã¶ãŒãç§ãã¡ãå£ããªãããã«ããããããããä¿®æ£ããå¿
èŠããããŸãã
é床ã®äœäžã«é¢ããŠã¯ã倧èŠæš¡ãªãããžã§ã¯ãã§ã¯ãã§ã«ããªãé
ããªã£ãŠããŸãããæ¡åŒµæ©èœã®æ°ãããã»ã©åœ±é¿ãäžãããã©ããã¯ããããŸããã ãã ããããã©ã«ããšããŠmjsãšcjsãè¿œå ããå¿
èŠãããããšã«åæããŸãã moduleFileExtensions: ['js']
ãæå®ãããšãããã©ã«ããäžæžããããŠé«éåãããŸãããïŒ ãããã£ãŠãããã©ãŒãã³ã¹ã®åŸ®èª¿æŽãšããŠãããææžåããã ããããããŸããã
ãã®ãã¹ãŠã®äœæ¥ã«æè¬ããŸãïŒ ããã¯ç¢ºãã«çŽ æŽãããã§ãã ç§ã¯3ã€ã®æé ã«åŸã£ïŒ "type": "module"
ç§ã®package.jsonã«ã "testEnvironment": "jest-environment-node"
ç§ã®åè«configã«ãã --experimental-vm-modules
CLIäžïŒãšãããã¯ããŸãã«ãããåããŠããããã«èŠããŸãð
ãããããã®åŸãç§ã¯èªã¿ã䜿çšããããšããŠããimport.meta
Node.jsã®ããã¥ã¡ã³ãã§èª¬æããããã«ïŒãã§ãã¯ããã¯ã¹ããå€æãã§ã«å®è£
ããŠããããã«èŠãããã®ïŒãäœæããããã«__dirname
ãããã¯ã®ããã«æããŸãimport.meta
ã倱æããŠããŸãïŒ
console.log(import.meta);
SyntaxError: [PATH]/files.test.js: Support for the experimental syntax 'importMeta' isn't currently enabled (31:20):
Add @babel/plugin-syntax-import-meta (https://git.io/vbKK6) to the 'plugins' section of your Babel config to enable parsing.
ç§ã¯ããã«ãæã£ãŠããŸããããããŠç§ã¯ããã«ããã®ä»äºã§åãæ®ãããŠãããšæããŸããã babelãã€ã³ã¹ããŒã«ããã«ãªããšãä¿®æ£ã§ãããã©ãããå ±åããããã«æ»ã£ãŠããŸãã
Node.js v14.3.0ãJest v25.5.4
ä»ã®ãšããåé¿çãèŠã€ããŸããã ãã¡ã€ã«ãã©ã€ãã©ãªã«ããã®ãšåããã£ã¬ã¯ããªããã¹ã¯ãªãããå®è¡ããŠããã®ã§ã次ã®ããšãã§ããŸãã
const __dirname = process.cwd();
const __filename = __dirname + "/files.test.js";
æŽæ°ãããå Žåã«åããŠããã®ãªããžããªããã©ããŒããŸãããããè¡ã£ãŠããã ããããããšãããããŸãã
æ§æãšããŠtransform: {}
ã䜿çšããŠãBabelãæ瀺çã«ãªããã¢ãŠãããå¿
èŠããããŸã
@SimenB transform: {}
è¿œå ãæ©èœããããšã確èªã§ããŸããããããšãïŒ ç§ã¯ãã®ç¹ããæå³ãããšããã«ãå€æãåé€ãããã§ã¯ãªãããå€æãè¿œå ããªãããšèª€è§£ããŸããã
ãšããã§ããã¹ãã¯2.4ç§ããããã1.3ç§ã«ãªããäžè²«ããŠé«éã«æããããŸãã
ããŒã12ã¯ããã©ã°ãèšå®ãããŠããªãESMïŒhttps://nodejs.org/en/blog/release/v12.17.0/ïŒã§ãªãªãŒã¹ãããŸããã ãã ããOPã«èšèŒãããŠããããã«ãJestã䜿çšããAPIã«ã¯ãã©ã°ãä»ããããŠããŸããã
@SimenBãã®ã¹ã¬ãããæ°å
Jest 26.0.1ãå®è¡ãããšã次ã®ãšã©ãŒãçºçããŸãã
Error [ERR_REQUIRE_ESM]: Must use import to load ES Module: /app/tests/setup.js
require() of ES modules is not supported.
require() of /app/tests/setup.js from /app/node_modules/@jest/transform/build/ScriptTransformer.js is an ES module file as it is a .js file whose nearest parent package.json contains "type": "module" which defines all .js files in that package scope as ES modules.
Instead rename setup.js to end in .cjs, change the requiring code to use import(), or remove "type": "module" from /app/package.json.
ç§ãæã£ãŠããtransform: {},
ãšããŠå®è¡ããŠããnode --experimental-vm-modules node_modules/jest/bin/jest.js
ã
ç§ã¯äœãæ¬ ããŠããŸããïŒ
@aldarundããããªããæå°éã®è€è£œããŸãšããŠããããŸããïŒ
@SimenBã¯ãåçŸããããã®æå°éã®ãªããžããªã§ãã yarn test
å®è¡ããã ãã§ããhttpsïŒ//github.com/aledalgrande/jest-example-ããŒã13/14ã§è©ŠããŸããããåãçµæã§ãã ã°ããŒãã«ã»ããã¢ããã®ãããŒã¯ãESMã§æ©èœããããã«æŽæ°ãããŠããªãããã§ãã
ãŸããããªãã¯ä»ã®èª°ãã«èšåããŸããð
ã @ simenBã§ã¯ãããŸãããã @ aledalgrandeã¯ãç§ãè©Šãããã®ãããã¹ãŠãæ£ããããã§ããæ¯èŒã®ããã«ããããžã§ã¯ããESMã§ãŠãã ããïŒ package.json
jest configïŒã
ãå¯èœã§ããã°ãããã°ããããã«ãjestæ§æãåçŽåããŠãããããæåã®package.json
ã§ãã2ã€ã®é¢é£ããããããã£ãæã€ããã«ããããšããå§ãããŸãã 次ã«ãçŸåšå¿
èŠãªä»ã®åããããã£ãè¿œå ããŠãã©ããæ©èœããã/æ©èœããªãã£ããã確èªããŸããã
ããã2çªç®ã®ã³ã¡ã³ãã¯globalSetup
èšåããŠããŠãéåžžã®ãã¹ãã§ã¯ãããŸãããããã§ã¯ç§ã®ã³ã¡ã³ããnvmããŸãã Jestã§globalSetup
ããŒãåé€ãããšããã®äŸã§ã¯ãã¹ãã¯æåŸ
ã©ããã«å®è¡ãããŸããã globalSetup
ããŒã¯ããªããèšã£ãããã«æ©èœããŸããã
ãããã°ããŒãã«ãªã»ããã¢ãããšå解ãå¿ããŠããŸããŸããã ä¿®æ£ã§ããŸãð
ããã«ã¡ã¯@SimenB ããŸãç§ã ååä»ããšã¯ã¹ããŒãã¯ãµããŒããããŠããŸããïŒ Node.jsã䜿çšãããšã次ã®ãããªããã±ãŒãžãã€ã³ããŒãããŠäœ¿çšã§ããŸãã
import { customAlphabet } from "nanoid";
ãã ããåãã³ãŒãã§ãã¹ããå®è¡ããããšãããšã次ã®ãšã©ãŒãçºçããŸãã
SyntaxError: The requested module 'nanoid' does not provide an export named 'customAlphabet'
ãã¹ãã§ã¯ãã³ãŒããããã«å€æŽã§ããæ©èœããŸãã
import nanoid from "nanoid";
const { customAlphabet } = nanoid;
ããããå®éã«ã¯ããã©ã«ãã®ã¹ããŒãããªããããNode.jsããŒãžã§ã³ã¯æ©èœããªããªããŸãïŒãã ããäœããã®çç±ã§ããã©ã«ãã®ãšã¯ã¹ããŒãã¯Jestã§æ©èœããŸãïŒã
SyntaxError: The requested module 'nanoid' does not provide an export named 'default'
å
¬éãããïŒãªããžããªã¯çŸåšæµåçã§ããããã§ãïŒ nanoid
ã³ãŒãã¯æ¬¡ã®ããã«çµäºããããã©ã«ãã®ãšã¯ã¹ããŒãã¯ãããŸããã
export { nanoid, customAlphabet, customRandom, urlAlphabet, random }
Jestã¯ãã¡ã€ã³ããšã³ããªãã€ã³ãã®ã¿ãæ¶è²»ããŸãã ã茞åºãã¯ãŸã èæ ®ãããŠããŸããã ããã©ã«ãã®ãšã¯ã¹ããŒããããªãcommonjsããŒãžã§ã³ãã€ã³ããŒãããã ãã§ãã
ããããªãã»ã©ã package.json
ã«ã¯ãããå«ãŸããŠããããã§ãïŒ
"main": "index.cjs",
"module": "index.js",
"exports": {
"./package.json": "./package.json",
".": {
"require": "./index.cjs",
"import": "./index.js",
"browser": "./index.browser.js"
},
...
}
...
ã€ãŸããããããNode.jsãã¢ãžã¥ãŒã«ããŒãžã§ã³ãèŠã€ããŠããã®ã«å¯ŸããJestã¯ååä»ããšã¯ã¹ããŒããæããªãCommonJSããŒãžã§ã³ã䜿çšããŠããã®ã§ã¯ãªãã§ããããã
Package Exports
ããã§ãã¯ããããŸã§åŸ
ã£ãŠãããã¹ãããŸãããã¹ãŠã®äœæ¥ã«æè¬ããŸãïŒ ãããã®2ã€ã®ã³ã¡ã³ãããããŸã§ã«è§£æ±ºæžã¿ãšããŠããŒã¯ããŸãã ç§ãåç
§ããŠãããã¹ãã¯ããã§ãã
ãããåæ€èšããŠããã®åäœã確èªããŸã-Jest26.0.1ãšããŒã14.4ã«ã¢ããã°ã¬ãŒãããŸããã package.jsonãã¢ãžã¥ãŒã«ã¿ã€ãã«èšå®ããtransformã{}
ãenvãjest-environment-node
ã«èšå®ãã node --experimental-vm-modules
ãŸãã ä»ãç§ã¯ãã®æ°ãããšã©ãŒãåãåããŸãïŒ
ES Modules are only supported if your test environment has the `getVmContext` function
getVmContext
ããã°ããåã«è¿œå ããããšããJestããã®å€æŽãã°ãé€ããŠãããã«é¢ããæ
å ±ãèŠã€ããããšãã§ããŸããã§ããã
äœãæ¡ã¯ïŒ
package.json
ã®é¢é£éšåã@cyberwombatã§å
±æããŠããã ããŸããïŒ Jestã«äœ¿çšããŠããèµ·åã¹ã¯ãªãããå«ã¿ãŸãã
åèãŸã§ã«ãããã¯äœæ¥äžã®ãããžã§ã¯ãã§ç§ãã©ã®ããã«èŠãããã§ãã
{
...
"type": "module",
"scripts": {
...
"test": "node --experimental-vm-modules node_modules/jest/bin/jest.js",
},
"jest": {
"transform": {},
"testEnvironment": "jest-environment-node"
},
...
次ã«ã npm test
èµ·åããŸã
@franciscopé±å±±ã¯åºæ¬çã«åãã§ãã ããŒã14.4.0ã ç§ã¯ããªããå
æ°ã«èµ°ãããããšãã§ããŸãã éããèŠãããã«ç©äºã«é£ã³èŸŒã¿ãŸãã
package.json
{
"type": "module",
"devDependencies": {
"jest": "^26.0.1",
},
}
jest.config.js
export default {
testEnvironment: 'jest-environment-node',
setupFilesAfterEnv: ['./test/bootstrap.js'],
testPathIgnorePatterns: ['<rootDir>/node_modules/', '<rootDir>/config/', '/<rootDir>/src/'],
testRegex: '(\\.|/)(test|spec)\\.[jt]sx?$',
transform: {
// '^.+\\.jsx?$': 'babel-jest' // esm someday
},
transformIgnorePatterns: [],
modulePaths: [
'<rootDir>/test',
'<rootDir>/src',
'<rootDir>'
]
}
èæ¬ïŒ
node --experimental-vm-modules node_modules/jest/bin/jest.js
ããããããŸããããéã®æ¹æ³ã§äœæ¥ããããšæããŸãã transform: {}
ãštestEnvironment: 'jest-environment-node'
ãé€ããã¹ãŠãåé€ããåã®ãšã©ãŒãããªã¬ãŒãããªãã·ã§ã³ã衚瀺ããããŸã§ãåãªãã·ã§ã³ã®è¿œå ãéå§ããŸãã ç§ã¯ç¹ã«transformIgnorePatterns
ãtransform
ãšç«¶åããŠããã®ã§ã¯ãªãããšçã£ãŠããŸãããç§ã¯åè«ã®ãªãã·ã§ã³ã«ããŸã詳ãããããŸããã
ããã«ã¡ã¯ãã¿ããªïŒ Jestã䜿çšããŠExpressã¢ããªã±ãŒã·ã§ã³ããã¹ãããŠãããšãã«ãåé¡ãçºçããŸããã 詳现ã¯ãã¡ãã ãããããªããããã§è¡ã£ãŠãã/远跡ããŠããããšã«åœ¹ç«ã€ãã©ããããããªãïŒroll_eyesïŒ
@ x80486æšæ¥ãŸã£ããåãåé¡ãçºçStackOverflowã§ãç§ã®ç解ããããé·ã説æã§
ç·šéïŒé¢é£æ§ããããšæãããããã以åã®ã³ã¡ã³ããå衚瀺ããŸããããã®"exports"
ã¯äººæ°ãããããã§ããããããããã€ããªããããã±ãŒãžã«é¢ãããã®èšäºããã§ãã
exports
ã¯ïŒ9771ã§è¿œè·¡ãããŸã
@franciscop okã®åé¡ã¯è§£æ±ºããŸãã-ããã±ãŒãžã«ç«¶åãããããšãå€æããŸãã- serverless-bundle
ã€ã³ã¹ããŒã«ããããã ES Modules are only supported if your test environment has the
getVmContext function
ãšã©ãŒãçºçããŸããã çç±ã¯ããããŸããããã€ã³ã¹ããŒã«ããŠãJestãšã®ç«¶åã¯çºçããªããšæããŸãããæããã«çºçããŸãã
@franciscop pkg.exports
é¢é£ã®åé¡ãä»æµ®äžãå§ããŠããçç±ã¯ããã®æ©èœãNode.js 14.x
ãã©ã°ãç«ãŠãããŠããããäžéšã®ããã±ãŒãžã¡ã³ãããŒïŒ uuid
å Žåã¯ç§ã®ãããªïŒãéå§ãããããã ãšæããŸãpkg.exports
ãã£ãŒã«ããè¿œå ããŸãã ãã®ãããNode.js 12.x
ãã®æ©èœãã¢ã¯ãã£ãåããããã«ã³ãã³ãã©ã€ã³ãã©ã°ãå¿
èŠã§ããããããã©ã«ãã§ãã®åäœãååŸããããã«ãªããŸããã
ãšã³ã·ã¹ãã å šäœãé©å¿ãããŸã§ã«ã¯ãã°ããæéãããããŸãã®ã§ããã®ãããã¯ã«é¢ããåé¡ãå ±åããŠããã ãããããšãããããŸãã
exports
ã«ã€ããŠæçš¿ããŠãã人ã®ããã«ããã®åé¡ã®é·ãã¹ã¬ããã§å€±ãããå Žåã«åããŠãããã«é¢ããç§ã®éããåé¡ïŒhttps://github.com/facebook/jest/issues/9565ïŒã«äŸããããŸããã®äžã®moduleNameMapper
åé¿çã®ã
5æã«å ±åãããglobalSetup
åé¡ã¯ãŸã ããå¯èœæ§ããããŸãïŒJest 26.1.0ïŒïŒ äŸã®ãªããžããª@aledalgrandeãšåããšã©ãŒãååŸãããšã次ã®ããã«
$ git clone [email protected]:aledalgrande/jest-example.git
$ cd jest-example
$ npm test
> @ test /Users/asko/Temp/jest-example
> node --experimental-vm-modules node_modules/jest/bin/jest.js --config=./jest.config.js
Error [ERR_REQUIRE_ESM]: Must use import to load ES Module: /Users/asko/Temp/jest-example/tests/setup.js
require() of ES modules is not supported.
require() of /Users/asko/Temp/jest-example/tests/setup.js from /Users/asko/Temp/jest-example/node_modules/@jest/transform/build/ScriptTransformer.js
æ¥ãå¿
èŠã¯ãããŸããã CHANGELOG
ã確èªããŸããããES6ã§ã®globalSetup / globalTeardownã®ä¿®æ£ã«ã€ããŠã¯èšåãããŠããŸããã§ããã
Node.js 14.4.0ãJest 26.1.0
æŽæ°ïŒ20幎8æ13æ¥ïŒïŒ
ããã§ãäžå¯èœãNode.js 14.7.0ãJest 26.4.0
å¯æ¬¡çãªæèŠã§ãããçŸæç¹ã§ã¯åè«ã®çŠç¹ã§ããããããã®åé¡ã¯åºå®ãããåé¡ã§ããå¿ èŠããããŸããïŒ
ESã¢ãžã¥ãŒã«ã§æžããããã¹ãã¬ããŒã¿ãŒãæ¶è²»ããããã«äœãããå¿
èŠããããã«ã€ããŠäœãèãã¯ãããŸããïŒ...
ææ°ã®jestããŒãžã§ã³ã§ã¯ããšã©ãŒãçºçããŸããããã¯ãtestSchedulerãcommonjs圢åŒã®ã«ã¹ã¿ã ã¬ããŒã¿ãŒãæåŸ
ããŠããããšãæ¬è³ªçã«ç€ºããŠããŸãããšã©ãŒã確èªããã«ã¯
ã/ projects / esw-ts / lib / dist / test / testReporter.jsïŒ1
'os'ããosãã€ã³ããŒãããŸãã
^^^^^^
SyntaxErrorïŒã¢ãžã¥ãŒã«å€ã§ã€ã³ããŒãã¹ããŒãã¡ã³ãã䜿çšã§ããŸãã
wrapSafeã§ïŒinternal / modules / cjs / loader.jsïŒ1116ïŒ16ïŒ
Module._compileã§ïŒinternal / modules / cjs / loader.jsïŒ1164ïŒ27ïŒ
Object.Module._extensions..jsïŒinternal / modules / cjs / loader.jsïŒ1220ïŒ10ïŒ
Module.loadã§ïŒinternal / modules / cjs / loader.jsïŒ1049ïŒ32ïŒ
Function.Module._loadïŒinternal / modules / cjs / loader.jsïŒ937ïŒ14ïŒã§
Module.requireïŒinternal / modules / cjs / loader.jsïŒ1089ïŒ19ïŒã§
å¿
èŠã«å¿ããŠïŒinternal / modules / cjs / helpers.jsïŒ73ïŒ18ïŒ
/Users/manish.gowardipe/Desktop/projects/esw-ts/lib/node_modules/@jest/core/build/TestScheduler.js:418:65
Array.forEachã§ïŒ
TestScheduler._addCustomReportersïŒ/Users/manish.gowardipe/Desktop/projects/esw-ts/lib/node_modules/@jest/core/build/TestScheduler.js:411:15ïŒ
ããã«ã¡ã¯ãç§ã®å°ããªãããžã§ã¯ãã§ESã¢ãžã¥ãŒã«ã®ãã€ãã£ããµããŒãããã¹ããããã®ã§ãããNodeJSãåããŠäœ¿çšããããããã®åé¡ã§è¿·åã«ãªããŸãããã¬ã€ãã³ã¹ããé¡ãããŸãã
node --version
ïŒv14.5.0yarn jest --version
ïŒ26.1.0package.json
{
"jest": {
"transform": {},
"testEnvironment": "jest-environment-node"
}
}
markov.test.js
const fs = require("fs");
const Markov = require("./markov.mjs");
// import fs from "fs";
// import Markov from "./markov.mjs";
const file = fs.readFileSync("text.txt", "utf8");
const markov = new Markov(file.toString());
test("Generates sentence with especified words", () => {
expect(markov.makeSentence(8).length).toBe(8);
});
yarn jest .
ãå®è¡ãããšã次ã®ãšã©ãŒãçºçããŸãã
node node_modules/jest/bin/jest.js .
è©ŠããŠã¿ãŸããããåããšã©ãŒãçºçããŸãã
@ petetorres1998ãã®ã¹ã¬ããã¯ããã€ãã£ãesmã¢ãžã¥ãŒã«ã䜿çšããŠJestãå®è¡ããããšã«é¢ãããã®ã§ãç¹å®ã®ãã©ã°/ãªãã·ã§ã³ã䜿çšããŠå®è¡ããå¿ èŠããããŸããå®è¡æ¹æ³ã«ã€ããŠã¯ãäžèšã®ã³ã¡ã³ããåç §ããŠãã ããïŒpackage.json㧠"type"ïŒ "module"ãèšå®ããŸãïŒã æ£çŽãªãšãããçŸæç¹ã§ã¯ãã©ã€ã ã¿ã€ã ã®æºåãæŽã£ãŠããªãããããããžã§ã¯ããæ©èœãããå¿ èŠãããå Žåã¯ãBabelã䜿çšããããšããå§ãããŸãã å®éã®ã·ã§ãŒã¹ããããŒã§ããæªãã§ãã¯ã®åé¡ãããã€ããããŸãã ç§ã¯æ°é±éåã«åãã§åãæ¿ããè©Šã¿ãããã«ã«æ³£ããªããæ»ã£ãŠããŸããã
ãã®èšå®ã§ãã¹ããã¡ã€ã«ã§jest.setTimeout(...)
ãããªããšãããããšãããšãä»ã®èª°ããReferenceError: jest is not defined
ååŸããŸããïŒ ãããesã¢ãžã¥ãŒã«ç°å¢ãããŒãããŒãžã§ã³ãjestããŒãžã§ã³ããŸãã¯ãããã®çµã¿åããã«é¢é£ããŠãããã©ãããææ¡ããããšããŠããŸãã ïŒçŸåšãããŒãv14.5.0ãjest 26.1.0ãenvironment jest-environment-nodeã䜿çšããŠããŸãïŒ
ç·šé
jest'global 'ããããã£ã®åé¡ã®èª¬æã«ãã§ãã¯ããã¯ã¹ããªãã«ãªã£ãŠããã®ãããããŸãã ð
@bdentinoæ瀺çã«ã€ã³ããŒãããŠã¿ãããšãã§ãããšæããŸãimport {jest} from '@jest/globals';
25.4.0ã¯ãæåã®ãµããŒããšãšãã«ãªãªãŒã¹ãããŸããã äžèšã®ïŒ9772ã«å ããŠãïŒ9842ãå«ãŸããŠããŸãã _çè«_ã§ã¯ãCJSãšESMã®æ··åãæ£ããæ©èœããããã«ãªããŸããïŒð€ïŒã
äžè¶³ããŠããäž»ãªæ©èœã®1ã€ã¯ã
jest
ãªããžã§ã¯ãã®ãµããŒãã§ããimport.meta
åºå·ããããimport {jest} from '@jest/globals'
ããã€ã³ããŒãããããã«èŠæ±ãããã¯æ±ºããŠããŸããã ãã£ãŒãããã¯ãããã ããã°å¹žãã§ãããã®ããã®ããã¥ã¡ã³ãã¯ãŸã äœæããŠããŸããããã¢ã¯ãã£ãåããã«ã¯3ã€ã®ããšãè¡ãå¿ èŠããããŸã
- å€æã¢ãŠã§ã€
import
ã¹ããŒãã¡ã³ããå®è¡ããªãããã«ããŠãã ããïŒæ§æã§transform: {}
ãèšå®ããããbabel
ããã¡ã€ã«ãCJSã«å€æããªãããã«ããŸãïŒmodules
ãåé¿ãããªã©ïŒãããªã»ããç°å¢ãžã®--experimental-vm-modules
ãã©ã°ãæå®ããŠnode@^12.16.0 || >=13.2.0
ãå®è¡ããŸãjest-environment-node
ãŸãã¯jest-environment-jsdom-sixteen
ãã¹ããå®è¡ããŸããã²ãè©Šãããã ãããã£ãŒãããã¯ããå¯ããã ããã ãã°ãå ±åããå Žåã¯ãåãã³ãŒãïŒãã¹ãåºæã®ã³ãŒããé€ãïŒã®å®è¡ãNodeã§ã©ã®ããã«å®è¡ãããããå«ããããšãã§ããã°çŽ æŽããããšæããŸãã éå»æ°é±éã«ããã£ãŠhttps://nodejs.org/api/esm.html_a lot_ãèªã¿ãŸããããããããäœããèŠéããŸããã
@SimenB
ãã®ã¹ã¬ããã¯å·šå€§ã«ãªããjestããå§ããŠESã¢ãžã¥ãŒã«ã䜿çšããã人ã¯ãããããããã®åºæ¬çãªã¬ã€ãã©ã€ã³ãèŠã€ããŠç解ããã®ãé£ãããšæããŸãã
ESã¢ãžã¥ãŒã«ãããžã§ã¯ããžã®jestã®è¿œå ïŒãŸãã¯ãã¯ã€ãã¯ã¹ã¿ãŒããïŒã«é¢ããæ£åŒãªèª¬æã¯ããã¥ã¡ã³ãã«ãããŸããïŒ
@aldeedåããããžã§ã¯ãã®ã¢ãžã¥ãŒã«ãã¢ãã¯ããåé¡ã«é¢ããŠãä¿®æ£ãèŠã€ããŸãããïŒ ç§ã¯ãŸã£ããåãåé¡ãæ±ããŠããŸã
ïŒãšããã§ãç§ãã¡ã¯ãªã¢ã¯ã·ã§ã³ã³ããŒã¹ã䜿çšããŠããã®ã§ããã®ããã«ä¹Ÿæ¯ããŸãïŒ
@guilhermetellesãããã httpsïŒ//github.com/facebook/jest/issues/10025ã§è¿œè·¡ãããŠã
Jest 26.1.0ã node
ããŒãžã§ã³14.6.0ãš--experimental-vm-modules
ã䜿çšããŠããŸãããCommonJSå
ã§import()
ã䜿çšãããšããŸã ERR_VM_DYNAMIC_IMPORT_CALLBACK_MISSING
ã衚瀺ãããŸãã ã æå°éã®åçŸãèãåºããæ°ããåé¡ãéãããã«ãã¹ãã§ããïŒ
äœè«ã§ãããJestãã€ãŒã³ããªãŒã䜿çšããŠããã®ã§ã yarn link
jest
ããã±ãŒãžã®ã³ããŒããããžã§ã¯ãã«yarn link
ããç°¡åãªæ¹æ³ã¯ãããŸããïŒ ããããŸã ãªãªãŒã¹ãããŠããªãããšã«ãã£ãŠå®è£
ãããå Žåã«åããŠãææ°ã®master
ãè©ŠããŠã¿ããã£ãã®ã§ãã path/to/facebook/jest/.yarn/releases/yarn-sources.cjs link --all path/to/jest
ãããªããšãããããšããŠããŸãããã倱æããŸããã cd node_modules; for p in jest*; do if [[ -d path/to/jest/packages/$p ]]; then rm -rf $p; ln -s path/to/jest/packages/$p; fi; done
ãããªãã®ãæåã§å®è¡ããããšãæ©èœããŸããã§ãããçç±ã¯ããããŸããã
CJSã®@vvanpo import()
ã¯Nodeã§å
ã«æ»ãããŸãããhttpsïŒ//github.com/nodejs/node/issues/31860ããã©ããŒã§ããŸã
ããŒã«ã«ã§ã®å®è¡ã«é¢ããŠã¯ãéåžžããã¹ãããããããžã§ã¯ãããjest
ãã¢ã³ã€ã³ã¹ããŒã«ããŠã ../jest/jest
ãŸãã æœåšçã«nose ../jest/packages/jest/bin/jest.js
ã å¿
ãæåã«yarn
ãšyarn build:js
ã ãããã®æé ãæ©èœããªãå ŽåïŒé£è¡æ©ã®é»è©±ã®ã¡ã¢ãªããæžã蟌ãã§ããŸãïŒãåé¡ïŒãŸãã¯PRïŒãéããŠããããCONTRIBUTING.md
ãã¡ã€ã«ã«æ£ããæžã蟌ãããšãã§ããããã«ããŠãã ããã
åšæçãªã€ã³ããŒãããµããŒãããäºå®ã¯ãããŸããïŒ
çžäºã«ã®ã¿ã€ã³ããŒããã2ã€ã®ãã¡ã€ã«ã®ãã¡ã®1ã€ã®ã¿ãã€ã³ããŒããããããŒã®ãã¹ããã¡ã€ã«ãããå Žåã RangeError: Maximum call stack size exceeded
ãååŸããŸãã ã€ã³ããŒãã®1ã€ãåé€ãããšããã¹ãã«åæ ŒããŸãã åé¡ãåçŸããã¬ãã
ããïŒ ããã空ã®ããŒããããžã§ã¯ãã§èšå®ããŸããããéåžžã«ããŸãæ©èœããŸããããæ¬çªç°å¢ã§ã¯ããã¹ããå®è¡ããããšãããšæ¬¡ã®ãšã©ãŒã¡ãã»ãŒãžã衚瀺ãããŸãã
ES Modules are only supported if your test environment has the 'getVmContext' function
以åã®è¿ä¿¡ïŒ @cyberwombatã«ããïŒã§ä»ã®èª°ããåé¡ãæ±ããŠããã®ãèŠãŸãããã圌ããåå ã§ããããšãããã£ãããã±ãŒãžã¯ã package.json
ãã¡ã€ã«ã«ååšããŸããã åé¡ã®åå ãšãªã£ãŠããããã±ãŒãžïŒãŸãã¯èšå®ïŒãæšæž¬ããã«ã¯ã©ãããã°ããã§ããïŒ ãã®äœæ¥ã«å¿
èŠã®ãªããã¹ãŠã®jestèšå®ãäœç³»çã«åé€ããããšããŸããããæåããŸããã§ããã
æŽæ°ïŒ jest-runtime
ããããªå€æŽãå ããããšã§ããªããšãé²æ©ãéããããšãã§ããŸããã VMã³ã³ããã¹ãã«ã¢ã¯ã»ã¹ããããšããè¡ã§ãããã¬ãŒãåæ¢ããŸããããé¢æ°ã¯å®éã«ã¯ååšããŸãããã this.context
ïŒè¿ãããã¯ãã§ãïŒãååšãããããããããã£ã«çŽæ¥ã¢ã¯ã»ã¹ããããã«ãã®è¡ãå€æŽããŸããã ããã¯ããããçæ³çã§ã¯ãªãããšã¯ããã£ãŠããŸããããããã@SimenBã䜿çšãããšãäœãåé¡ã«ãªã£ãŠããã®ãã
å©ããŠãããŠããããšã
åšæçãªã€ã³ããŒãããµããŒãããäºå®ã¯ãããŸããïŒ
ééããªãïŒ å¥ã®åé¡ãéããŠããããŸããïŒ
@zsombroã¯ãå€ãããŒãžã§ã³ã®ãã¹ãç°å¢ãå®è¡ããŠããããã§ãã ããªãã¯å®è¡ãããšjest --show-config
ã§è¡šç€ºãããŠããå
容ãã testEnvironment
ïŒ
å€ãããŒãžã§ã³ã®ãã¹ãç°å¢ãå®è¡ããŠããããã§ãã ããªãã¯å®è¡ãããš
jest --show-config
ã§è¡šç€ºãããŠããå 容ããtestEnvironment
ïŒ
@SimenBããã¯æ¬¡ã®ããã«èšã£ãŠããŸãïŒ
"testEnvironment": "/Users/zberki/git/project-name/node_modules/jest-environment-node/build/index.js",
"testEnvironmentOptions": {},
ããªãã®æ瀺ã«åºã¥ããŠjest-environment-node
èšå®ããŸãã
ãã®ããã»ã¹ãéå§ããåã«ã yarn add jest@latest
ã䜿çšããŠjestãã¢ããã°ã¬ãŒãããŸããã ç°å¢ãåå¥ã«ã¢ããã°ã¬ãŒãããå¿
èŠããããŸããïŒ
æŽæ°ïŒããã¯ç§ãããªããã°ãªããªãã£ãããšãnode_modules
ãšyarn.lock
ãåé€ããŸããããããã§ãæ©èœããŸããã§ããã ãã ãã yarn add -D jest-environment-node
ã䜿çšããŠæåã§è¿œå ãããšãæ©èœããããã§ãã ããã管çããããã®ããè¯ãæ¹æ³ã¯ãããŸããïŒ ã³ãŒãããŒã¹ã§ãããè¡ãåã«ãæå°éã®ãã¹ããããžã§ã¯ããå®è¡ããŸãããããããå®è¡ããå¿
èŠã¯ãããŸããã§ããã
yarn list jest-environemnt-node
ïŒãŸãã¯npm list jest-environemnt-node
ïŒã¯ããããè€æ°ããªã¹ãããŸããç§ã®æšæž¬ã§ã
ââ [email protected]
â ââ [email protected]
ââ [email protected]
26.2.0
ããŒãžã§ã³ã¯ããããç§ãæåã§ã€ã³ã¹ããŒã«ãããã®ã§ãïŒå°ãªããšãpackage.json
ã«åºã¥ããŠããŸããã€ãŸãã jest-config
ã¯æããã«å€ãããŒãžã§ã³ãã€ã³ã¹ããŒã«ããŠããŸããïŒ
å€ãããŒãžã§ã³ã®jest-config
ïŒããããreact-scripts
ïŒ create-react-app
ïŒïŒïŒããã«ããäœãããããŸãã ãã®åé¡ã¯ãããè°è«ããå Žæã§ã¯ãããŸãããthoð
globalSetup
ESã¢ãžã¥ãŒã«ã䜿çšã§ããªãããšãåé¡ã«ãªãå§ããŠããŸãã
2ã€ã®ãã€ã³ãïŒ
ç§ïŒ
"testEnvironment": "jest-environment-node",
ãè¿œå ããŸããimport { jest } from '@jest/globals';
è¿œå ããŸããNODE_OPTIONS='--experimental-vm-modules' yarn jest
å®è¡ããŠããã¹ãã³ãã³ãèšå®--experimental-vm-modules
ãå®è¡ããŸãããããŠãããã¯æ¬¡ã®ã³ãŒãã§ã¯ã©ãã·ã¥ããŸãïŒ
jest.mock('../../some/other/path', () => ({
someOtherMethod: jest.fn().mockImplementation(âŠ),
}));
次ã®ãšã©ãŒãçºçããŸãïŒççž®-ãèš±å¯ããããªããžã§ã¯ããã«æ³šæããŠãã ããïŒïŒïŒ
ReferenceError: src/foo/bar.spec.js: The module factory of `jest.mock()` is not allowed to reference any out-of-scope variables.
Invalid variable access: jest
Allowed objects: Array, âŠ, jest, âŠ, unescape.
Note: This is a precaution to guard against uninitialized mock variables. If it is ensured that the mock is required lazily, variable names prefixed with `mock` (case insensitive) are permitted.
Babelãªãã§ããŒã14ã§å®è¡ããããã«ä¿®æ£ããã€ã³ããŒããäžé©åã«è§£æãããããBabelã䜿çšã§ããŸããã
-import { map } from 'lodash';
+import lodash from 'lodash';
+const { map } = lodash;
æ®å¿µãªãããããã¯@babel/preset-env
ã«ãã£ãŠäžé©åã«è§£æãããçµæãšããŠTypeError: Cannot destructure property 'map' of '_lodash.default' as it is undefined.
ãŸãã
誰ããç§ããã®åé¡ãåé¿ããã®ãæäŒã£ãŠãããŸããïŒ
ç·šéïŒãã®çµ¶å¯Ÿã«å«ãªä¿®æ£ãè¡ãããšã§ãCommonJSã€ã³ããŒãã䜿çšããŠãã€ãã£ãESã¢ãžã¥ãŒã«äºæã³ãŒãã§Jest + Babelã䜿çšã§ããããã§ãã
jest.mock('common-js-module', () => ({
__esModule: false,
...jest.requireActual('common-js-module'),
}));
ãã¡ãã§ãã
import lodash from 'lodash';
const { map } = lodash;
ããŒã14ã«ãã£ãŠå®å šã«æ¶è²»ãããJest + Babelãå®è¡ããçµæã®ã³ãŒãã¯
var _lodash = _interopRequireDefault(require("lodash"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
const {
map
} = _lodash.default;
ãŸãå®è¡ãããŸãã
ãã¹ãŠã®jestãã¹ããES6ã³ãŒãã䜿çšããŠã€ã³ããŒãããããã«æ£åžžã«å€æããŸããããããã€ãã®ããã±ãŒãžãã€ãŸãpuppeteer
ãšuuid
ã¹ã¿ãã¯ããŸããã
ã¢ããªã¯ããããããªããžã§ã¯ãïŒ import uuid from 'uuid'
ïŒã«ã€ã³ããŒãããå Žåã«ã®ã¿æ©èœããŸããããã¹ãã¯ãã®æ¹æ³ã§ã¯å®è¡ãããŸããã ãã ãããã®ã€ã³ããŒããå解æ§æïŒ import { v4 } from 'uuid'
ãªã©ïŒã«çœ®ãæãããšãéã«ãªããŸãããã¹ãã¯æ©èœããŸãããã¢ããªã¯äŸå€ãã¹ããŒããŸãã
åœåã¯ã¬ã€ãã«åŸãããã¹ãŠã®å€æããªãã«ããŸããããæå°éã®ããŒãæ§æã§babelãã€ã³ã¹ããŒã«ããyarnã¯ãŒã¯ã¹ããŒã¹ãäœæããããšããŸããããããã§ã¯ãã®ç¹å®ã®åé¡ã¯è§£æ±ºïŒãŸãã¯æªåïŒããŸããã§ãã
ãã ãããã®ã€ã³ããŒããå解æ§æïŒimport {v4} from'uuid 'ãªã©ïŒã«çœ®ãæãããšãéã«ãªããŸãããã¹ãã¯æ©èœããŸãããã¢ããªã¯äŸå€ãã¹ããŒããŸãã
ã¢ããªã¯CommonJSã«ã³ã³ãã€ã«ãããŠãããå®éã«ã¯ã¢ãžã¥ãŒã«ã䜿çšããŠããªãããã§ãã ãå®éã®ãESMããimport uuid from 'uuid'
ã¯æ©èœããªãã¯ãã§ããããã¯ã uuid
ã«ã¯ããã©ã«ãã®ãšã¯ã¹ããŒãããªããããŒãã®ESMãã«ããå
¬éãããŠããããã§ãã
ãã@SimenB ãããã«é¢ããããã€ãã®äºåçãªããã¥ã¡ã³ããè¯ãèãã ãšæããŸããïŒ
@grantcarthewééããªãïŒ ããã«ãã£ãšæéããããŠããžã§ã¹ã27ã®ããã«å®å®ãããããšæã£ãŠããŸãããããããã§ãããšã¯æããŸããã ããããçŸåšããã«ãããã®ïŒãããŠããã¯å®éšçã§ããïŒã«ã€ããŠã®ããã¥ã¡ã³ãããŒãžãæžãããšã¯è¯ãèãã®ããã«èãããŸã
@SimenBåé¡ã®çŸåšã®ç¶æ³ã¯ããããŸããããŸããJestãç§ã®ã±ãŒã¹ã§ãã§ã«æ©èœãããã©ããã¯ããããŸããããäœããã®åœ¢ã§åœ¹ç«ã€å¯èœæ§ããããŸãã
esmã®ã¿ã®ã©ã€ãã©ãªãããŒãããããšããŠããŸãïŒæ¡åŒµæ©èœã¯cjsã§ãããã¿ã€ãã¯ã¢ãžã¥ãŒã«ã§ãããããŒãã¯ããã§åé¡ãªãããã§ãïŒããJestã¯ãšã©ãŒã§æ£ããããŒãã§ããŸããã
C:\dev\codemirror-next-repro-cra\test-in-jest-esm\node_modules\style-mod\dist\style-mod.cjs:15
export var StyleModule = function StyleModule(spec, options) {
ããã§ç§ãæåã«éããåé¡https://github.com/codemirror/codemirror.next/issues/310ã ãããŠãããŒã14.13.1ã§å€±æããJest + ESMã®åçŸhttps://github.com/dubzzz/codemirror-next-repro-cra/tree/main/test-in-jest-esm
@dubzzz cjs
ãã¡ã€ã«ã«ESMãå«ããããšã¯ã§ããŸããã ããŒãã倱æããŸã
$ node node_modules/style-mod/dist/style-mod.cjs
(node:48829) Warning: To load an ES module, set "type": "module" in the package.json or use the .mjs extension.
(Use `node --trace-warnings ...` to show where the warning was created)
/Users/simen/repos/codemirror-next-repro-cra/test-in-jest-esm/node_modules/style-mod/dist/style-mod.cjs:15
export var StyleModule = function StyleModule(spec, options) {
^^^^^^
SyntaxError: Unexpected token 'export'
at wrapSafe (internal/modules/cjs/loader.js:1172:16)
at Module._compile (internal/modules/cjs/loader.js:1220:27)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1277:10)
at Module.load (internal/modules/cjs/loader.js:1105:32)
at Function.Module._load (internal/modules/cjs/loader.js:967:14)
at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:60:12)
at internal/main/run_main_module.js:17:47
ç³ãèš³ãããŸããããããŒãåŽã§ã®è©Šè¡ãéãããŸããã @ nicolo-ribaudoã¯ããã®åé¡ã«ã€ããŠlibã®äœæè
ã«ãã§ã«éç¥ããŠããŸãã
çŽ æ©ãåçããããšãããããŸããã
ç§ã¯ããã§ããã€ãã®ïŒã»ãšãã©ã¹ã¿ãã®ïŒããã¥ã¡ã³ãã®PRãéããŸããïŒïŒ10611ã äžè¶³ããŠããæ©èœããã°ãããããåæããããšã¯ããŸããã§ãããçŸå®ãšã®åæãä¿ã€ã®ã¯é£ãããšæãã®ã§ãgithubã®åé¡ã調ã¹ãããšã¯ãïŒé¡ããã°âŠïŒææ°ã®ç¶æ ã§ãããããããè¯ãã¢ãããŒãã§ãã
æ°ããåé¡ãšããŠ@Pomax ããé¡ãããŸãð
CJSããã®import()
ãµããŒããè¿œå ããïŒ10620ãéããŸããã æ°åãªã¯ãšã¹ããããã®ã¯https://github.com/facebook/jest/issues/9430#issuecomment-626054595ã®ãããªãã®ã§ã
ããã«ã¡ã¯ã ESMã®èåŸã«ããã¹ããŒãªãŒå
šäœãããŒã/ãžã§ã¹ãã«ãã°ããåãå
¥ããã®ã¯éåžžã«é£ããã®ã§ããããããç§ã¯äœãæçœãªããšãæ±ããŠãããããã§ã«çããŠããŸãã 次ã®ã±ãŒã¹ã¯ãŸã ãµããŒããããŠããªãããšãæ£ããç解ããŠããŸããïŒ ãŸãã¯ãç§ã¯æ£ããæ¹æ³ã§ã¯ãªãäœããããŠããããšãé¡ã£ãŠããŸããïŒ import x from 'x'
æ©èœããããã«æããŸããã import { sub } from 'x'
ç Žæ£ã¯æ©èœããŸããã
package.jsonïŒ
{
"name": "jest-uuid",
"version": "1.0.0",
"type": "module",
"scripts": {
"test": "node --experimental-vm-modules node_modules/.bin/jest"
},
"devDependencies": {
"jest": "26.5.2"
},
"dependencies": {
"uuid": "8.3.1"
}
}
f.spec.js
import { v4 } from 'uuid';
test('', () => {});
npmãã¹ã
> npm test
> [email protected] test /Users/igoro/p/tmp/jest-uuid
> node --experimental-vm-modules node_modules/.bin/jest
FAIL ./f.spec.js
â Test suite failed to run
SyntaxError: The requested module 'uuid' does not provide an export named 'v4'
at jasmine2 (node_modules/jest-jasmine2/build/index.js:228:5)
Test Suites: 1 failed, 1 total
Tests: 0 total
Snapshots: 0 total
Time: 0.879 s
Ran all test suites.
(node:94492) ExperimentalWarning: VM Modules is an experimental feature. This feature could change at any time
(Use `node --trace-warnings ...` to show where the warning was created)
npm ERR! Test failed. See above for more details.
ïŒ9771ãåŸ
ã£ãŠããŸãã ãã®åã«ãJestã¯uuid
ãESMãšããŠããŒãããã®ãå®å
šã§ããããšãç¥ããŸããïŒã€ãŸããã©ã®ãã¡ã€ã«ãã©ã®æç¹ã§ããŒããããã¯ãESMã§ããããšãããããŸãïŒã
ããã¯ãCJSãåå空éãšããŠã®ã¿ããŒãã§ããNodeç¬èªã®èŠåã«åŸãã®ã§ããããããããšãNodeèªäœã§ã¯å®éã«ã¯æ©èœããªãæ§æãèš±å¯ããããšã§ãããããæ¹åãããã®ã§ããããã ïŒããšãã°ãããŒãã¯CJSããã±ãŒãžã§ããããimport { readdirSync } from "fs-extra"
èš±å¯ããŸãããã const { readdirSync } = fs
ã䜿çšããŠè§£åã§ããimport fs from "fs-extra";
ã¯èš±å¯ããŸãïŒã
ïŒããšãã°ãããŒãã¯ãchild_processãããã®import {spawn}ãèš±å¯ããŸãããããã¯CJSããã±ãŒãžã§ããããã§ããããchild_processãããã®import child_processã¯èš±å¯ãããŸããããã¯ãconst {spawn} = child_process;ã䜿çšããŠè§£åã§ããŸãïŒã
ããã¯æ®å¿µãªäŸã§ããããŒãã¯ãchild_processãããçµã¿èŸŒã¿ãïŒCJSã§ã¯ãªãïŒã¢ãžã¥ãŒã«ãšèŠãªããããååä»ããšã¯ã¹ããŒãã¯æ©èœããŸãã ææ°ã®nodejsã¯ããã¥ãŒãªã¹ãã£ãã¯ã䜿çšããŠãå€ãã®ååä»ããšã¯ã¹ããŒããCJSã¢ãžã¥ãŒã«ã§æ©èœãããŸãã ããã¯ãšãã¥ã¬ãŒãããã®ãæãé£ããéšåãããããŸããã
代ããã«fs-extra
ã䜿çšããããã«æŽæ°ãããäŸã ããããååä»ããšã¯ã¹ããŒããããŒãã®ããŒããããã«ããããã®ã¡ãžã£ãŒãŸãã¯æ¬¡ã®ã¡ãžã£ãŒã®ãããããçéžãããå ŽåãJestã¯ãããå
åãããã®ãçã«ããªã£ãŠããŸãã
ããã¯ãã§ã«å®è£ ãããŠããã¯ãã§ã-ããŒãã³ã¢ã¢ãžã¥ãŒã«ã¯ååä»ããšã¯ã¹ããŒããå ¬éããŸããããéåžžã®ãCJSã¯å ¬éããŸããã
ææ°ã®nodejsã¯ããã¥ãŒãªã¹ãã£ãã¯ã䜿çšããŠãå€ãã®ååä»ããšã¯ã¹ããŒããCJSã¢ãžã¥ãŒã«ã§æ©èœãããŸãã ããã¯ãšãã¥ã¬ãŒãããã®ãæãé£ããéšåãããããŸããã
ãããå®è£ ããŠããPRãžã®ãªã³ã¯ã¯ãããŸããïŒ å°ãªããšããšãã¥ã¬ãŒãããå¿ èŠããããŸãð
PRã¯ããã«ãããŸãïŒ https ïŒ
ãã®èåŸã«ãããã¥ãŒãªã¹ãã£ãã¯ã¯cjs-module-lexer
ïŒhttps://github.com/guybedford/cjs-module-lexerïŒãšããŠå
¬éãããŠããŸããã @ guybedfordã¯æœåšçãªéžè±ã«ã€ããŠè©³ããç¥ã£ãŠããå¯èœæ§ããããŸãã
ãããèŠãŠã¿ããšã fs-extra
ã¯æ¬¡ã®ãããªãšã¯ã¹ããŒããã¿ãŒã³ã䜿çšããŠããããã§ãã
module.exports = {
// Export promiseified graceful-fs:
...require('./fs'),
// Export extra methods:
...require('./copy-sync'),
...require('./copy'),
...require('./empty'),
...require('./ensure'),
...require('./json'),
...require('./mkdirs'),
...require('./move-sync'),
...require('./move'),
...require('./output'),
...require('./path-exists'),
...require('./remove')
}
ããã¯çŸåšãç§ãã¡ãæ€åºããåãšã¯ã¹ããŒãåæã®ã±ãŒã¹ã§ã¯ãããŸããããååä»ããšã¯ã¹ããŒãã®æ€åºãåŠçããã®ã«åœ¹ç«ã€ã±ãŒã¹ã§ããã°ãcjs-module-lexerã«è¿œå ã§ããå¯èœæ§ããããŸãã
@ jkrems ïŒ@ guybedfordã«æè¬ããŸãïŒ ãã®ã¢ãžã¥ãŒã«ã䜿çšããŠPRãéããŸããïŒïŒ10673
https://github.com/facebook/jest/issues/9430#issuecomment -713204282ã§èª¬æãããŠããæ£ç¢ºãªfs-extraãµããŒãã¯ã httpsïŒ// githubã®ã¢ããã¹ããªãŒã ãã©ããã³ã°ã§ãã[email protected]ã«å®è£ ãããŠããŸãã com / nodejs / node / pull / 35745ã
_æŽæ°ïŒãã®ãã«ãããã¹ããããšããã¹ãŠã®fs-extraé¢æ°ãæ£ããæ€åºãããŸãããforã«ãŒããèšå®ãããŠããããéçã«åæã§ããªããããæ®å¿µãªããNode.jsãã€ãã£ãé¢æ°ã¯æ€åºãããŸããã_
featïŒååä»ãESMã€ã³ããŒããšããŠCJSããã®ååä»ããšã¯ã¹ããŒãããµããŒãïŒ10673
ãã€ãã£ãESMã¯ãCommonJSã¢ãžã¥ãŒã«ã®exports
ãdefault
ãšããŠã€ã³ããŒãããããšã®ã¿ããµããŒãããŠãããšæããŸãããïŒ
@trusktrã¯ãããããŸããïŒ https ïŒ
ããã«ã¡ã¯ã ESMã®èåŸã«ããã¹ããŒãªãŒå šäœãããŒã/ãžã§ã¹ãã«ãã°ããåãå ¥ããã®ã¯éåžžã«é£ããã®ã§ããããããç§ã¯äœãæçœãªããšãæ±ããŠãããããã§ã«çããŠããŸãã 次ã®ã±ãŒã¹ã¯ãŸã ãµããŒããããŠããªãããšãæ£ããç解ããŠããŸããïŒ ãŸãã¯ãç§ã¯æ£ããæ¹æ³ã§ã¯ãªãäœããããŠããããšãé¡ã£ãŠããŸããïŒ
import x from 'x'
æ©èœããããã«æããŸãããimport { sub } from 'x'
ç Žæ£ã¯æ©èœããŸããã..ã
'uuid'ãã{v4}ãã€ã³ããŒãããŸãã
ESMã¢ãžã¥ãŒã«ã¯ãæ§æããµããŒãããŠããããã«èŠããŠããã€ã³ããŒãã®ç Žæ£ããµããŒãããŠããŸããã ãããæ©èœãããã«ã¯ããexportv4ããå¿ èŠã§ãã 'exportdefault'ã¯äžèŽããŸããã
https://kentcdodds.com/blog/misunderstanding-es6-modules-upgrading-babel-tears-and-a-solution
@sdwlig uuid
ã¯ååä»ããšã¯ã¹ããŒããæäŸããããã©ã«ãã®ãšã¯ã¹ããŒãã¯ãããŸããã åäœããã¯ãã§ããããexportsããã£ãŒã«ããæã€ããã±ãŒãžããã®esmã®ããŒãã¯ãŸã jestã§ã¯ãµããŒããããŠããŸããã 代ããã«CommonjsãããŒããããŸãããããã¯ããã©ã«ãã®ãšã¯ã¹ããŒãã§ã®ã¿å©çšã§ããŸãã
https://github.com/uuidjs/uuid/blob/master/src/index.js
ããã«ããã±ãŒãžèªå·±åç §ãµããŒãïŒïŒ10883ïŒãè¿œå ã§ããŸããïŒ
æãåèã«ãªãã³ã¡ã³ã
ïŒ9772ã§éåžžã«åºæ¬çãªãµããŒããéå§ããŸããã ç§ã¯æãåçŽãªã±ãŒã¹ã®ã¿ããã¹ãããŸãããå€ãã®æ¢ç¥ã®å¶éããããŸãïŒç¹ã«ãCJSãšESMãæ··åšãããå Žåã®
jest
ãªããžã§ã¯ãã®ãµããŒããšå£ããã»ãã³ãã£ã¯ã¹ã¯ãããŸããïŒããå°ãªããšãããã¯_äœã_ã§ãã Jestã®æ¬¡ã®ãªãªãŒã¹ã§ãªãªãŒã¹ãããäºå®ã§ãïŒã§ããã°ããã«ãïŒ9806ã«ãã£ãŠã®ã¿ãããã¯ãããŸãïŒ