ãããããµããŒãããç°å¢ã§å®è¡ããïŒBabelã䜿çšããŠES5ã«ãã©ã³ã¹ãã€ã«ãããŠããªãããšãæå³ããïŒãããçš®ã®default
é¢æ°ããšã¯ã¹ããŒãããEcmaScriptã¢ãžã¥ãŒã«ã¯ãESåå空éãä»æ§ã«åŸã£ãŠäžå€ã§ãããããã¹ã¿ãåã§ããŸããã Sinonãããã«ã€ããŠã§ããããšã¯äœããªãã®ã§ããããè¡ãããšãããšæ瀺çã«ãšã©ãŒãã¹ããŒããŸãïŒ 'ES Modules cannot be stubbed'
ã
ãããã @ jdaltonã¯ãEcmaScriptã¢ãžã¥ãŒã«ïŒ *.mjs
ïŒã®ããŒããå¯èœã«ããNodeã®ã©ã³ã¿ã€ã ããŒããŒã§ããesm
ãSinonãªã©ã䜿çšããã¹ã¿ããå¯èœã«ããããã«mutableNamespace
è¿œå ããŸãesm
ã
ãã¹ãã¹ã¯ãªãããšãšãã«ã esm
ãšãªãã·ã§ã³ã䜿çšããŠããŒããå®è¡ããããã«npm
ãèšå®ããæ¹æ³ã瀺ãããæ¹æ³ãã»ã¯ã·ã§ã³ã®äžã«èšäºãããã¯ãã§ãã
åç §ïŒ
ç§ã¯ãŸãã«ãããæžãããšãèããŠããŸãã:)
ãåé¡ãã¯ã esm
ã䜿çšã§ããããŸããŸãªæ¹æ³ãå€æ°ããããšã§ãããå°ãªããšãæãäžè¬çãªã±ãŒã¹ãã«ããŒããå¿
èŠããããŸããããã¯ã require
ãã©ã°ã䜿çšããŠnode
ããã»ã¹ã ããã§èšå®ãã¡ã€ã«ã®äœ¿çšæ¹æ³ãå
·äœåãå§ããŸããããç°å¢å€æ°ãšããŠjsonæååãæå®ããããšãå¯èœã§ããããã§ãïŒã³ãŒãã䜿çšããå Žåã¯ãªãã·ã§ã³ããã·ã¥ã«å ããŠïŒã
ããã«ã¡ã¯@ fatso83ïŒ
cjs.mutableNamespace
ãªãã·ã§ã³ã¯ããã©ã«ãã§æå¹ã«ãªã£ãŠãããããæ§æã¯å¿
èŠãããŸããã ã¹ã¿ãã¯.js
ãã .mjs
.js
ã§ã¯æ©èœããŸãã_ïŒ .mjs
ãã¡ã€ã«ã¯ããã¯ããŠã³ãããŠããããã esm
ãªãã·ã§ã³ã¯ãããŸããïŒ_ã
@jdalton js
ãšmjs
éãããç¥ããããã ãããããšãããããŸãã ãããããã®ç·ããããæ©èœãããããšãã§ããªãã£ãçç±ã説æããŠããŸãã
cc @ jim-king-2000
æå°éã®ã³ã¹ãã§åäœãã¹ããæžãããã§ãã 解決çãéåžžã«é£ããå Žåã¯ãã¢ãã¯ã䜿çšããåäœãã¹ããäžæ¢ããããšæããŸãã çµå±ã®ãšãããæš¡æ¬ãã¹ãã¯å ç¢ãªãªã³ã©ã€ã³ã·ã¹ãã ãæ§ç¯ããããã®å¿ é ã®æ¹æ³ã§ã¯ãããŸããã ããããæåŸã®æ段ãšããŠãsinonããproxyrequireãïŒãŸãã¯ãã®ãããªãã®ïŒãã©ããããå¯èœæ§ã¯ãããŸããïŒ
@ jim-king-2000ããã¯ç¯å²å€ã§ãã ãšã¯ã¹ããŒããäžå€ã§ãããšæ³å®ãããã¢ãžã¥ãŒã«ã·ã¹ãã ã䜿çšããããšãæ瀺çã«éžæããŸããã æ®å¿µãªãããããã¯ããªããããªãèªèº«ã®åŽã§è² æ ããªããã°ãªããªãè²»çšã§ãã ã¢ãžã¥ãŒã«ããŒããŒãã©ããããŠãããããçš®é¡ã®ã·ããªãªïŒããŒãããã©ãŠã¶ãŒããã©ã³ã¹ãã€ã©ãŒã®æç¡ãªã©ïŒã§æ©èœãããã«ã¯ãã³ã¹ãããããããããã®ãããžã§ã¯ãã§è¿°ã¹ãããŠããç®æšãšã¯å®éã«ã¯äœã®é¢ä¿ããããŸããã
ã·ãã³ãšã¢ãžã¥ãŒã«ã·ã¹ãã ã®é¢é£æ§ãããããããŸããïŒããããªããïŒã ç§ãå¿ èŠãšããŠããã®ã¯ãbabelã®ãªãjs / nodeã¢ãã¯ãŠããããã¹ããã¬ãŒã ã¯ãŒã¯ïŒãŸãã¯Javaã®å¯Ÿå¿ç©ã§ããmockitoã®ãããªã©ã€ãã©ãªïŒã§ãã ããã§ãããã¯ååšããŸããïŒ
èŠããã«ãããªãã®ç¹å®ã®ãããã®ããã«ïŒçŸåšã§ã¯ãããŸããïŒsobïŒ
äžè¬çã«ïŒã¯ãããã¬ãŒã ã¯ãŒã¯ãšã©ã³ã¿ã€ã ã®ã»ãŒãã¹ãŠã®çµã¿åããã§ãããå®çŸããæ¹æ³ããããŸãã
Javaã®çšèªã§ã¯ãJava static
ã¡ãœããã䜿çšããŠã·ã¹ãã å
šäœãå®è£
ããMockitoã䜿çšããŠã¯ã©ã¹ãã¢ãã¯ã¢ãŠãããããšãããããªãã®ã§ãã ããã¯ã§ããŸããã
ããã¯èšã£ãŠããç©äºãæ©èœãããããã«å¿
èŠãªã®ã¯ã *.mjs
ãã¡ã€ã«ã®ååã*.js
ã§ãã ããã¯å®çšçãªäžéã®ããã«æããŸããæ¢ç¥ã®æ¬ ç¹ããªããŠããã¹ã容ææ§ãåŸãããããã§ãã
Javaã®éçé¢æ°ã®ã¢ãã¯ã«ã¯ãpowermockã䜿çšããŸãã ããããç§ã¯ãã®æ¯èŒãå®å šã«ã¯ç解ããŠããªããããããŸããã ã¡ãªã¿ã«ãç§ã¯Javaã奜ãã§ã¯ãªããé²åãé ãããŸãã ä»ã§ãasync / awaitããµããŒãããŠããŸããã
ç§ã¯ã©ãã§ã* .mjsã䜿çšããŠããŸããããã¹ãŠã®ãœãŒã¹ã³ãŒãã¯mjsãã¡ã€ã«ã§ãã ããã«ãããã¯ç§ãåã³babelã«é Œããªããã°ãªããªãããšãæå³ããŸãïŒäœåãªéçº/å®è¡æã®äœæ¥ãšåä»ãªåŒã³åºãã¹ã¿ãã¯ãå°å ¥ããŸãïŒã ãã¹ããã¡ã€ã«ã* .jsã«æ»ãããšããã§ããªããŠãåé¡ãããŸããã
ä»ã®äœã³ã¹ãã®æ¹æ³ãèŠã€ãããŸã§ãã¢ãã¯ã䜿çšããŠutãæŸæ£ããŸãïŒä»ã®ãã¹ãã¯ãã®ãŸãŸã§ãïŒã
@ fatso83ãã£ãšå©ããŠãããŠããããšãã
誰ããå£è«ãè©Šã¿ãŸãããïŒ ð€
åèãŸã§ã«ãã¢ãã¯ã©ã€ãã©ãªã§ãããtestdouble.jsãã«Node.jsESMãµããŒããå®è£ ããŸããã å¯èœã§ãã ç§ã¯ãã®ããã°æçš¿ã§å®è£ ã«ã€ããŠæžããŸããïŒ
誰ãããããåŒãåããããšæã£ãããããã§å©ããŠããããšå¬ããã§ãã
@giltayar ESMãµããŒãã®å®è£ ããã§ãšãããããŸãïŒ çŽ æŽãããèšäºããšããã§ã ESã¢ãžã¥ãŒã«ã®ã¹ã¿ãã¯ESMã©ã³ã¿ã€ã ã«æºæ ããããšã¯ã§ããªããšåžžã«èšã£ãŠããŸããããïŒäžèšã®ããã«ïŒãããã·ã¯ã¯ã€ã¢ãåé ç·ããŸãã¯... Quibbleãªã©ã䜿çšããŠãªã³ã¯ã¬ãã«ã§åŠçããå¿ èŠããããšãèšããŸããããµããŒããè¿œå ããå Žæ:)
ç§ã®äœæ¥ãããžã§ã¯ãã§ã¯ã proxyquire
ã䜿çšããŠESã¢ãžã¥ãŒã«ããäŸåé¢ä¿ãã¹ã¿ãã¢ãŠãããŸããã
proxyquire('./mylib.mjs', {doSomething: () => 'done'})
ããã¯ãQuibbleïŒTestDoubleã§äœ¿çšïŒã§ããŸã£ããåãã§ãããã®èšäºã«ã¯ãã®ãããªäŸããããŸãããQuibbleã¯éšåçãªã¹ã¿ãããµããŒãããŠããªããããåäœãå°ãç°ãªããŸãã
await quibble.esm('./mylib.mjs', {doSomething: () => 'done'}, 'yabadabadoing') // not sure what this third param does ...
ãããã£ãŠãåè¿°ã®å 容ã«æ²¿ã£ãŠãSinonã¯ESã¢ãžã¥ãŒã«ã®ã¢ãã¯ã®ãµããŒããæ瀺çã«è¿œå ããããšã¯ãããŸãããããã¯ãQuibbleãProxyquireãRewireã NormalModuleReplacementPlugin ïŒwebpackïŒãããã³100ïŒ ç°å¢ã§ããä»ã®ãã¹ãŠã®æ¹æ³ã«ä»»ããæ¹ãããããã§ããäŸåã
@ fatso83ãªãããããæ瀺çã«ãµããŒããè¿œå ããªãããšç¢ºä¿¡ããŠããã®ããšçåã«æããããããŸãããã ES6ã¢ãžã¥ãŒã«ã³ãŒããã¢ãã¯ããããã®è§£æ±ºçãå¿ æ»ã«æ¢ããŠããéãç§ã¯ããæ°æ¥ãããã§äœåºŠããããèªã¿ãŸããã
Jestã§ææžåããã解決çã¯ãªããããã«ã¯äœããããŸããã @giltayarã®èšäºãèŠã€ãããŸã§ãç§ã¯ã»ãšãã©ãããããŸããã ãã®ãããªå®å µã testdouble.jsã䜿çšã§ããããšã«æ°ä»ããŸã§ãquibbleã§äœããæ©èœããããã«ãªããŸããã
JavaScriptã§ã¯ããã¹ãŠã®ããã±ãŒãžã«ç¬èªã®ããã¥ã¡ã³ãã¹ã¿ã€ã«ããããã»ãšãã©ã®å Žåãå®éã®APIããã¥ã¡ã³ãããªãããšã¯ãã§ã«ååã«å°é£ã§ããããã¹ãã©ã€ãã©ãªã®åäœãã¢ãã¯ã©ã€ãã©ãªã®åäœãããã³ã¢ãã¯ã©ã€ãã©ãªã®ã¢ãžã¥ãŒã«ããŒããŒã®åäœãç解ããå¿ èŠããããŸãã ã
ä»ã®äººãããšã³ããŠãŒã¶ãŒãããã°ã©ããŒã®ããã«ãããã®ããã±ãŒãžãäžç·ã«é ç·ããããšã«éäžã§ããäžæ¹ã§ãããªãããã®ãŸãŸSinonã«çŠç¹ãåããããšèšããªããç§ã¯å®å šã«åæããŸãã ç§ã®ãããªããã°ã©ããŒã«ã¯æ¬åœã«èŠçãããããšã瀺ãããã ãã§ããããã»ã¹ãç°¡çŽ åãããã°ãç¹ã«å€ãã®äººãä»åŸESã¢ãžã¥ãŒã«ã«ç§»è¡ããå Žåã¯ãå€ãã®äººãåã¶ãšç¢ºä¿¡ããŠããŸãã
ç§ã¯ããã»ã©æ·±ãæè¡çç解ãæã£ãŠããŸãããç§ã¯ç§ã®çµéšã®ããã€ãã®ãã£ãŒãããã¯ã圹ç«ã€ãããããªããšæã£ãã ãã§ã
@ fatso83ãªãããããæ瀺çã«ãµããŒããè¿œå ããªãããšç¢ºä¿¡ããŠããã®ããšçåã«æããããããŸãããã
ç¹°ãè¿ãã«ãªããŸãããèŒžå ¥åã®ã¢ãã¯ãæ±ãããšã¯Sinonã®ç¯å²å€ã§ãããå°éã®å³æžé€šãããé©åã«åãçµããšããã®ã¯Sinonã®ã¡ã³ããã®æèŠã§ãã
äžè¬ã«ããã¹ãŠã®ã©ã³ã¿ã€ã ã§ãã¹ãŠãå®è¡ããããšããã©ã€ãã©ãªãäœæããããšã¯æå³ããããŸããã ããã»ã©å€§ãããªããè³éãååã«ãããªãŒãã³ãœãŒã¹ãããžã§ã¯ãããããè¡ãããšã¯ããŠããŸããã
Jestã§ææžåããã解決çã¯ãªããããã«ã¯äœããããŸããã @giltayarã®èšäºãèŠã€ãããŸã§ãç§ã¯ã»ãšãã©ãããããŸããã ãã®ãããªå®å µã testdouble.jsã䜿çšã§ããããšã«æ°ä»ããŸã§ãquibbleã§äœããæ©èœããããã«ãªããŸããã
ã©ã€ãã©ãªãç°ãªãã°ãéžæãç°ãªããŸãã
testdouble.jsã®ã¡ã³ããã¯ç¬èªã®éžæãããŸãã 圌ãã¯ãquibbleãå ¬éãããããã©ã€ãã©ãªã«çµ±åããããšã«ããŸããã 圌ãã«ãšã£ãŠè¯ãããšã§ãã ããªãã圌ãã®è§£æ±ºçã奜ããªãããã²ããã䜿ã£ãŠãã ããã @searlsãš
JavaScriptã§ã¯ããã¹ãŠã®ããã±ãŒãžã«ç¬èªã®ããã¥ã¡ã³ãã¹ã¿ã€ã«ããããã»ãšãã©ã®å Žåãå®éã®APIããã¥ã¡ã³ãããªãããšã¯ãã§ã«ååã«å°é£ã§ããããã¹ãã©ã€ãã©ãªã®åäœãã¢ãã¯ã©ã€ãã©ãªã®åäœãããã³ã¢ãã¯ã©ã€ãã©ãªã®ã¢ãžã¥ãŒã«ããŒããŒã®åäœãç解ããå¿ èŠããããŸãã ã
ä»ã®äººãããšã³ããŠãŒã¶ãŒãããã°ã©ããŒã®ããã«ãããã®ããã±ãŒãžãäžç·ã«é ç·ããããšã«éäžã§ããäžæ¹ã§ãããªãããã®ãŸãŸSinonã«çŠç¹ãåããããšèšããªããç§ã¯å®å šã«åæããŸãã ç§ã®ãããªããã°ã©ããŒã«ã¯æ¬åœã«èŠçãããããšã瀺ãããã ãã§ããããã»ã¹ãç°¡çŽ åãããã°ãç¹ã«å€ãã®äººãä»åŸESã¢ãžã¥ãŒã«ã«ç§»è¡ããå Žåã¯ãå€ãã®äººãåã¶ãšç¢ºä¿¡ããŠããŸãã
JavaScriptãšã³ã·ã¹ãã ã®ãã¹ãŠã®åé¡ã解決ããããã«ããã«ããããã§ã¯ãããŸããã
10幎以äžã®éãããŸããŸãªã¡ã³ãããSinonãã¡ããªãŒã®ã©ã€ãã©ãªãç¡æã§æäŸããŠããŸããã äºå®äžããããã®ã©ã€ãã©ãªã®ä¿å®ã«è²»ãããããã¹ãŠã®äœæ¥ã¯ãä¿å®æ åœè ã®èªç±ãªæéã«ãç¡çµŠã®äœæ¥ãšããŠè¡ãããŠããŸãã ç§ãã¡ã¯JavaScriptãå°éçã«äœ¿çšããŠãããããªãã®äžæºãå ±æããŠããŸãã ããããç¡æã§æäŸããæéã¯ããŸããããŸããã
ç§ã¯ããã»ã©æ·±ãæè¡çç解ãæã£ãŠããŸãããç§ã¯ç§ã®çµéšã®ããã€ãã®ãã£ãŒãããã¯ã圹ç«ã€ãããããªããšæã£ãã ãã§ã
äŸåé¢ä¿ããããã欲æ±äžæºã«ã€ããŠã®ããã°æçš¿ãæžããŠãèªåã«åã£ã解決çã«ãã©ãçããŸã§ããããŠJavaScriptãããŒãããç¹å®ã®æ¹æ³ã§testdouble.jsãã©ã®ããã«äœ¿çšããŠå€§æåãåãããã«ã€ããŠããã°ã«æçš¿ãããšäŸ¿å©ã§ãã
å
å®ãªããã°æçš¿ã§ããããšãå€æããå Žåã¯ã sinonjs.org
宣äŒãããŠããã ããŸãã
@mroderickæåã«ãããªããšSinonã®ã¡ã³ãããç§ã®æé«ã®æ¬æãæã£ãŠããããšãæ確ã«ããå¿ èŠããããšæããŸãïŒ
JavaScriptãšã³ã·ã¹ãã ã®ãã¹ãŠã®åé¡ã解決ããããã«ããã«ããããã§ã¯ãããŸããã
確ãã«ããã§ã¯ãããŸããããããã¯ä»ã®èšèªãããå©ãã®å¿ èŠæ§ã倧ãããããããªãããšã瀺ãããã ãã®ãã®ã§ããïŒç§ã®æšæž¬ã§ãïŒã
èŒžå ¥åã®ã¢ãã¯ãæ±ãããšã¯Sinonã®ç¯å²å€ã§ãããå°éã®å³æžé€šã«ãã£ãŠããé©åã«åãçµãŸããŠããŸãã
ååã«å ¬å¹³ãªããšã§ãããç§ãèšã£ãããã«ãç§ã¯ãããç解ããããšãã§ããããããããªãã¯ãããã®æ©èœãå®è£ ããããšã«ãã£ãŠå«ãŸããåªåãããæ·±ãç解ããŠããã§ãããã ãŸããããŒããŒAPIã¯ãŸã å®éšæ®µéã§ãã
ç§ã¯çŸåšãåäœããããŒãžã§ã³ãã§ã次第ãªãŒãã³ãœãŒã¹ãšããŠãªãªãŒã¹ããäºå®ã®å°ããªCLIããŒã«ã«åãçµãã§ããŸãã ãããè¡ãããããç§ã¯ããã«ã€ããŠã®ããã°æçš¿ãæžãããšãæ€èšããŸãã ç§ã¯Sinonã«ã€ããŠããŸãã«ãå€ãã®è¯ãããšãèªãã ã®ã§ã以åã¯proxyquire
Sinonãè©ŠããŸãã
ç§ã¯Sinonã«ã€ããŠããŸãã«ãå€ãã®è¯ãããšãèªãã ã®ã§ã以åã¯
proxyquire
Sinonãè©ŠããŸãã
ãã®æ¹æ³ã«é¢ããã¬ã€ãããããŸãïŒ https ïŒ
ã¬ã€ããæ¹åã§ããå Žåã¯ããã«ãªã¯ãšã¹ããéä¿¡ããŠãã ããð
æãåèã«ãªãã³ã¡ã³ã
@giltayar ESMãµããŒãã®å®è£ ããã§ãšãããããŸãïŒ çŽ æŽãããèšäºããšããã§ã ESã¢ãžã¥ãŒã«ã®ã¹ã¿ãã¯ESMã©ã³ã¿ã€ã ã«æºæ ããããšã¯ã§ããªããšåžžã«èšã£ãŠããŸããããïŒäžèšã®ããã«ïŒãããã·ã¯ã¯ã€ã¢ãåé ç·ããŸãã¯... Quibbleãªã©ã䜿çšããŠãªã³ã¯ã¬ãã«ã§åŠçããå¿ èŠããããšãèšããŸããããµããŒããè¿œå ããå Žæ:)
ç§ã®äœæ¥ãããžã§ã¯ãã§ã¯ã
proxyquire
ã䜿çšããŠESã¢ãžã¥ãŒã«ããäŸåé¢ä¿ãã¹ã¿ãã¢ãŠãããŸãããããã¯ãQuibbleïŒTestDoubleã§äœ¿çšïŒã§ããŸã£ããåãã§ãããã®èšäºã«ã¯ãã®ãããªäŸããããŸãããQuibbleã¯éšåçãªã¹ã¿ãããµããŒãããŠããªããããåäœãå°ãç°ãªããŸãã
ãããã£ãŠãåè¿°ã®å 容ã«æ²¿ã£ãŠãSinonã¯ESã¢ãžã¥ãŒã«ã®ã¢ãã¯ã®ãµããŒããæ瀺çã«è¿œå ããããšã¯ãããŸãããããã¯ãQuibbleãProxyquireãRewireã NormalModuleReplacementPlugin ïŒwebpackïŒãããã³100ïŒ ç°å¢ã§ããä»ã®ãã¹ãŠã®æ¹æ³ã«ä»»ããæ¹ãããããã§ããäŸåã