æåŸã®ãã¹ããå®äºããåŸãJestããã»ã¹ãå®äºããªããšããåé¡ããããŸãã ãŠãŒã¶ãŒã¯ãctrl-cã䜿çšããŠããã»ã¹ã匷å¶çã«çµäºããå¿ èŠããããŸãã ç§ã®çè«ã§ã¯ããã¹ãŠã®ãªãœãŒã¹ããã¹ãäœæè ã«ãã£ãŠé©åã«ã¯ãªãŒã³ã¢ãããããŠããããã§ã¯ãããŸããããçæ³çã«ã¯Jestã¯ãšã«ããçµäºããå¿ èŠããããŸãã
å
·äœçã«ã¯ãFirebaseãfirebase-server
ã§ãã¹ãããŠããããã¹ãããšã«1ã€ä»¥äžã®ãµãŒããŒãèµ·åããŠããŸãã afterEach
ã¢ã¯ã·ã§ã³ã§ã¯ãæåŸã®ãã¹ãã§äœæããããã¹ãŠã®ãµãŒããŒã«å¯ŸããŠclose
ã¡ãœãããåŒã³åºããŸããããã®ã¡ãœããã䜿çšããŠããJestããã»ã¹ã¯çµäºããŸããã
ãã¹ããçµäºããïŒåæ ŒãŸãã¯äžåæ ŒïŒãšãJestããã»ã¹ã匷å¶çã«çµäºããæ¹æ³ã¯ãããŸããïŒ afterAll
ããã¯ãååŸããŠãæ®ã£ãŠãããã¹ãŠã®ãªãœãŒã¹ãã¯ãªãŒã³ã¢ããããæ¹æ³ã¯ãããŸããïŒ Jestããã»ã¹ãçµäºããã®ãæ£ç¢ºã«åŠšãããã®ããããã°ããæ¹æ³ã¯ãããŸããïŒ ããããšãã
çŸåšããããè¡ãããã®è¯ãæ¹æ³ã¯ãããŸããã ãããã¬ãŒïŒChrome InspectorïŒãããã¯ããŠãäœãèµ·ãã£ãŠããã®ããææ¡ããããšããå§ãããŸãã äœãéåæäœæ¥ãäœæããããç¥ã£ãŠããå Žåã¯ãã¢ã³ããŒããããé©çšããŠè¿œè·¡ããããšãã§ããŸãïŒPromise.prototype.thenã®åšãã«äœãã眮ããªã©ïŒ
ãã¹ãŠã®afterEach
/ after
ããã¯ã解決ããããšãã«ãéåæäœæ¥ã匷å¶çã«çµäºã§ããªãçç±ã¯ãããŸããïŒ
æ¢åã®éåæããã»ã¹ãåŠçã§ããªãå Žåãããããã©ã®ããã«åŒ·å¶çµäºãããã¯ããããŸããã
ava
ãã移è¡ããŸããããããã¯åé¡ã§ã¯ãªãã£ãã®ã§ãçããããã®ã§ããããã ãã¶ãããã¯Node.jsã®process.exit
ã§ã
ããã¯å¯èœã ãšæããŸãããå¿ èŠãªãšãã«ã¶ãäžãããããªãœãŒã¹ãé©åã«ã·ã£ããããŠã³ããŠããªãã®ã§ã¯ãªãããšå¿é ããŠããŸãã
cc @dmitriiabramovã©ãæããŸããïŒ
äžäŸïŒç§ã¯å®éã«Jestã§ããã«ééããŸãããããã§ã¯ãJestèªäœãçµäºãããªãé·æéå®è¡ãããŠãããŠã©ããã£ãŒããã»ã¹ããããŸããã Jestããã¹ãå®è¡äžã«èªæ®ºãããšãããïŒãããšïŒïŒãç§ã¯ãã®åé¡ã«æ°ä»ããªãã£ãã§ããããã人ã ãããã䜿ãããšãããšãã³ã°ããããŒãžã§ã³ãåºè·ããã§ãããã
ããã»ã¹ã匷å¶çã«åŒ·å¶çµäºããŠãå®å
šãã©ããã¯ããããŸããã åæã«ããã¹ãã®å®äºåŸã«éåæåŸåŠçãå®è¡ãããå Žåã¯ã after all
ããã¯ã䜿çšããŠãããã»ã¹ãçµäºããåã«çµäºããã®ãåŸ
ã€ããšãã§ããŸãã
ãã1ã€ã®åé¡ã¯ãå°å·ãå®äºããåã«åºåã¹ããªãŒã ãã«ããããããšã§ãã 以åãããã»ã¹ãçµäºããåã«ãšã©ãŒã¡ãã»ãŒãžãå°å·ããã®ã«ååãªæéããªããšãã«ããã®åé¡ãçºçããŸããã
åé¡ã¯ãJestããäžéšã®ãã¹ããèªåãã¡ã§ã¯ãªãŒã³ã¢ãããããŠããªãããã§ãããããäœãèµ·ãã£ãŠããã®ãããšèšãæ¹æ³ãç解ã§ãããã©ããã§ãã
after all
ããã¯ã¯ããã§ç§ãå©ããããšãã§ããŸãããããç§ã¯ããã¥ã¡ã³ãã§ãã®ãããªããšãèŠãŠããŸããïŒ afterEach
ïŒç§ã¯äœããéããŠããŸããïŒ
æ£ããã¯ãªãŒã³ã¢ããã®ãã¹ãã«é¢ããŠã¯ã_files_ãæéã©ããã«å®äºããŠãããã©ãããããã³åé¡ãç¹å®ããããã«ãã€ã»ã¯ãæ©èœã䜿çšããŠããªããã©ããããã¹ãã§ãããã©ããïŒrspecã®ããã«ïŒã
ããããŸãããããã«èª¿æ»ããçµæãããã¯Firebaseèªäœã«åé¡ãããããã§ã process.exit
ãåŒã³åºã以å€ã«ã¯ãªãŒã³ã¢ããããæ¹æ³ã¯ãããŸããã
ãªãœãŒã¹ïŒ
ãã¹ãŠã®åé¿çã«ã¯ãæåã§process.exit
åŒã³åºãããšãå«ãŸããŸãã Jestã®ã³ã³ããã¹ãã§ãããè¡ãããšãæããŠããŸããããã®ãããªé»è©±ããããå Žæã«é¢ããæšå¥šäºé
ã¯ãããŸããïŒ ç§ã®æåã®èãã¯æ¬¡ã®ãããªãã®ã§ããïŒ
afterAll(() => setTimeout(() => process.exit(), 1000))
âŠãã¹ãŠã®ãã¹ãã®å®è¡ãçµäºããŠãã1ç§åŸã«çµäºããJestã«åŠçãå®è¡ãããŸãããã ããããããŠã©ããã¢ãŒãã«ã©ã®ããã«åœ±é¿ãããã¯ããããŸãããæ£ããå ŽåãJestã¯ããããæåŸ ã©ããã«æ©èœããªãå¯èœæ§ã®ããããã€ãã®åã£ã䞊ååŠçãå®è¡ããŸãã ãããã¯ãããã¯Jestã§ä¿®æ£ããå¿ èŠããããã®ã§ããããïŒ ãããå€ãã®äººã«ãšã£ãŠãããã¬ã³ã®ããã«æãããªãããžã§ã¹ãã«å ¥ããŠã¿ãŸãããïŒ ãŸãã¯ãå°ãªããšããèŠåãã¢ãŒããšã匷å¶çµäºãã¢ãŒããåãæ¿ããŸãã
mochaãšåæ§ã«ããã¹ãã®å®äºæã«ããã»ã¹ãèªåçã«éãã--exit
ãã©ã°ãªã©ïŒãã¡ã€ã«ããšã®ã³ã¡ã³ããªã©ïŒã欲ããã§ãã ãã¹ãŠã®ãã¹ããã¡ã€ã«ã®ãã¹ãŠã®æ¥ç¶ãæåã§éããã®ã¯å°ãé¢åã§ãã
Codeshipã§ãã¹ããå®è¡ãããšãåãåé¡ãçºçdrone.ioã§ã
ãã ããããŒã«ã«ã§ã¯æ£ããæ©èœããŸãã
ç·šéïŒ
Firebaseãä¿®æ£ããå¿ èŠãããããã«æããŸãã
--forceExitAfterTestRun
ãšãããªãã·ã§ã³ãè¿œå ããããšã«äºçŽã¯ãããŸããããç°¡åã«è¿œå ã§ããã¯ãã§ãã ããã§çµäºããã«ã¯å€æŽãå¿
èŠã ãšæããŸãïŒ https ïŒ
ããçš®ã®ç«¶åç¶æ ã®ããã§ãã ãã¹ãŠã®ãã¹ããããŒã«ã«ã§å®è¡ããåŸã«çµäºããå Žåãããã°ãçµäºããªãå ŽåããããŸã...
ã¢ãã¯ã®ä»£ããã«å®éã®ããŒã¿ããŒã¹ã䜿çšããŠããAPIä»æ§ã«Jestã䜿çšãå§ããåŸãããããå®è¡ããŠããŸãïŒç³ãèš³ãããŸãããðããã¹ãããã·ã§ããã¯ããã«æé©ã§ãïŒã afterAll
ããã¯ãè¿œå ããŠæ¥ç¶ãã¯ãªãŒã³ã¢ããããåŸã§ããåé¡ã解決ããããšãã§ããŸãããããã¯ããããã°ãæãç°¡åã§ã¯ãªãã setupFiles
ã®ãã£ã¯ã¹ãã£ã®æ¯éå£ã«äœããã®é¢ä¿ããããšä¿¡ããŠããŸãã
ãžã£ã¹ãã³ã«ã¯--forceexit
ãªãã·ã§ã³ãããããã§ãã®ã§ãåæ§ã®ãã®ããžã§ã¹ãã«ãå±ããã©ããã¯æå¥ãèšããŸããð
å¥ã®åé¡-ãã¹ãã倱æããå Žåã afterAll()
ã¯åŒã³åºãããªããããäœãã¯ãªãŒã³ã¢ããããããäœãéããããŸããã --bail
ãããä¿®æ£ããããšæããŸããããŸã è©ŠããŠããŸãã
誰ããPRãéãããã®ãªããããã¯ç§ãã¡ãå©ããåããããšãã§ãããã®ã§ãããç§ã¯ä»¥åã®ã³ã¡ã³ãã§è©³çŽ°ãæŠèª¬ããŸãã:)
é±æ«ã«æéãããã°ãè©ŠããŠã¿ãŸãã 誰ãããã®åã«ãããããããã®ãªããããã¯ã¯ãŒã«ã ããïŒsmileïŒ
éåºããã°ããã®PRã«è³æããŠéäŒã ããã§è°è«ãç¶ããŸãã
èªãã§ãã人ã¯èª°ã§ã--forceExit
ãã©ã°ã䜿çšããŠãã®æ©èœã«ã¢ã¯ã»ã¹ã§ããŸãã ð
ã°ãŒã°ã«ã®å ŽåïŒJestã¯Jenkins CIã§çµäºããŸããããããŒã«ã«ã§ã¯çµäºããŸãã --forceExit
確ãã«ç§ã®ããã«ä¿®æ£ããŸããã
ç§ã«ãšã£ãŠã¯ã.thenïŒïŒïŒ=> {}ïŒã§promiseãåŠçããã®ãå¿ããŠããŸãã-ä»äºãããŸãã
ç§ã¯ãŸã ããã«èŠåŽããŠããŸãã async
ãšawait
䜿çšããŠAPIããã¹ãããŠããŸãã Expressã¢ããªã±ãŒã·ã§ã³ã«æ¥ç¶ããŠãšã³ããã€ã³ãã«pingãå®è¡ããŸãããããã¹ããçµäºããŸããã mongodbãšãµãŒããŒãžã®æ¥ç¶ãéããããšããŸãããããŸã éããŠããŸãã 空ã®jsonã®ã¿ãéãè¿ããŸãã
ç§ã®å Žåãããã¯Firebaseã®åé¡ã«ãªããŸããã 䜿çšãã
afterAll(() => {
firebaseApp.database().goOffline();
firebaseApp.delete();
});
ããªãã¯ãããããã§ãã äž¡æ¹ã®è¡ãå®éã«å¿
èŠã§ãããå
ã
.initializeApp()
ããååŸãããã®ãšåãfirebaseApp
ã䜿çšããå¿
èŠãããããšãããããŸããã
forceExitãªãã§ããã解決ããæ¹æ³ã¯ãããŸããïŒ
Jest 23ã«ã¯ãJestãçµäºã§ããªãçç±ã®ãœãŒã¹ã瀺ã--detectOpenHandles
ãšãããã©ã°ãå«ãŸããŠããŸãã
--detectOpenHandlesã¯mongoose.connectãšmongoose.modelãè¿ããŸãã afterAllã§mongoose.disconnectãå®è¡ããããšãããšãmongoãšã©ãŒããããžãç Žæ£ãããŸãã
@elkhanã¯ããã³ã°ãŒã¹ã®åé¡ã解決ããæ¹æ³ãç解ããŠããŸããïŒ
--detectOpenHandles
è¿œå ããåŸãJestã¯ãã¹ããå®äºããã ãã§ãªããå®éã«Jestããããã¯ãããã®ã衚瀺ããŸãããããã¯å¥åŠãªããšã§ãã ãã°ã®ããã§ãã
ç§ã®å Žåã --forceExit
ã§åé¡ã解決ããåæã«--detectOpenHandles
ããäœãæ€åºãããŸããïŒããŒã«ã«ãšCircleCIã®äž¡æ¹ïŒã ç§ã--runInBand
ãŸãã
ç§ã«ãšã£ãŠã¯ã --runInBand
åé€ããããšã§è§£æ±ºããŸããã
--forceExit
ã¯ãshippableã䜿çšããå Žåã«ãåé¡ã解決ããŸã... --detectOpenHandles
è©ŠããŸããããçµæãåŸãããããã«ãããã³ã°ããã ãã§ãã
--detectOpenHandles
è¿œå ãããšãå¥åŠãªåé¡ãä¿®æ£ãããŸãã
ããŒãïŒv8.12.0
ãžã§ã¹ãïŒv23.6.0
--detectOpenHandles
ãŸãã¯--forceExit
ãè¿œå ããŠããCodeshipã§å®è¡ããŠããå Žåã®åé¡ã¯ä¿®æ£ãããŸããã
jest --ci --verbose --forceExit --detectOpenHandle
ããŒãïŒv8.12.0
ãžã§ã¹ãïŒv23.6.0
@sibeliusãã®åé¡ãåé¿ããæ¹æ³ã¯ãã¢ãã«ã®inité¢æ°ããã¥ãŒãããããšã§ãã
const mongoose = require('mongoose');
mongoose.Model.init = () => {};
ããã«ãããã€ã³ããã¯ã¹ã¯äœæãããŸããããJestãã¢ãã«ã«ã€ããŠæå¥ãèšãã®ãé²ããŸãã
db.collection("test-collection").add({
title: 'post title',
content: 'This is the test post content.',
date: new Date(),
})
.then(docRef => {
console.log('Document written with ID: ', docRef);
})
.catch(error => {
console.error('Error adding document: ', error);
});
jest --forceExit --detectOpenHandle
ãã¹ãã«åæ ŒããŸãããã .then
ãŸãã¯.catch
ã®ã³ãŒãã¯å®è¡ãããŸãã!!
äœãæ¡ã¯ïŒ
@alexpchinãããç§ãããã解決ããæ¹æ³ã§ãïŒ
beforeAll(async (done) => {
dbConnection = await mongoose.connect(...)
done()
})
afterAll(async (done) => {
await dbConnection.close()
dbConnection.on('disconnected', done)
})
NestJsã§ç§ã¯è¿œå ããªããã°ãªããŸããã§ãã
afterAll(() => {
app.close();
});
ãã®åé¡ã¯ãjestããã»ã¹ã®ã¡ã¢ãªäžè¶³ãåå ã§ããããšãããããŸããã --maxWorkers=10
è¿œå ãããšãåé¡ãä¿®æ£ãããŸããã
ç§ã¯ãã®åå ãè¿œå ããŠããŸããããããããã®åé¡ã«çåãæ±ããŠãã誰ãããç§ãæã£ãŠããããã«ããã®çç±ãæã£ãŠããå¯èœæ§ããããŸãã
ç§ã¯Traviså
ã§Jestã䜿çšããŠNodeJSã¢ããªããã¹ãããŠããŸããããJestã®çŽåŸã«ã¿ã€ã ã¢ãŠããããŸã§travisããã³ã°ãç¶ããŸããã ãžã§ã¹ãã¯ééããŠããªãã£ãããã§ãã
äœåºŠãè©ŠããçµæãJSDomã§jestã䜿çšããŠããããšãçç±ã§ããããšãããããŸããã
jest.config.js
ãã¡ã€ã«ã«æ¬¡ã®è¡ããããŸããã
'testURL': 'http://localhost/',
ããã«ãããJSDomãããŒãããããã¹ãŠã®ãªãœãŒã¹ãæ£åžžã«éãããããJestãåç¶ããŠãããšæãããŸãã
ç§ã¯è¡ãåé€ããããšã§ããã解決ããŸãã-ããããJestã¯æ¬¡ã®ãšã©ãŒã§å€±æããŸããããåç §ããŠãã ããïŒ
SecurityError: localStorage is not available for opaque origins
ããã解決ããããã«ãç§ã¯jest.config.js
以äžãè¿œå ããŸããïŒ
'testEnvironment': 'node',
ããã誰ããå©ããããšãé¡ã£ãŠããŸããç§ã¯ãã®åå ãè¿œå ããŠããŸããããããããã®åé¡ã«çåãæã£ãŠãã誰ããç§ãæã£ãŠããããã«ããã®çç±ãæã£ãŠãããããããŸããã
ç§ã¯Traviså
ã§Jestã䜿çšããŠNodeJSã¢ããªããã¹ãããŠããŸããããJestã®çŽåŸã«ã¿ã€ã ã¢ãŠããããŸã§travisããã³ã°ãç¶ããŸããã ãžã§ã¹ãã¯ééããŠããªãã£ãããã§ãã
äœåºŠãè©ŠããçµæãJSDomã§jestã䜿çšããŠããããšãçç±ã§ããããšãããããŸããã
jest.config.js
ãã¡ã€ã«ã«æ¬¡ã®è¡ããããŸããã
'testURL': 'http://localhost/',
ããã«ãããJSDomãããŒãããããã¹ãŠã®ãªãœãŒã¹ãæ£åžžã«éãããããJestãåç¶ããŠãããšæãããŸãã
ç§ã¯è¡ãåé€ããããšã§ããã解決ããŸãã-ããããJestã¯æ¬¡ã®ãšã©ãŒã§å€±æããŸããããåç §ããŠãã ããïŒ
SecurityError: localStorage is not available for opaque origins
ããã解決ããããã«ãç§ã¯ä»¥äžãjest.config.js
ã«è¿œå ããŸããïŒ
'testEnvironment': 'node',
ããã誰ã«ã§ã圹ç«ã€ããšãé¡ã£ãŠããŸãã
--forceExit --detectOpenHandles --maxWorkers = 10
ç§ãã¡ã®ããã«ãããããŸãã
ããŒãïŒ8.11.3
åè«23.6.0
NestJsã§ç§ã¯è¿œå ããªããã°ãªããŸããã§ãã
afterAll(() => { app.close(); });
NestJSã®äººã
ã®ããã«ãããããã«æ®ããŠãã ããïŒ
NestJSã䜿çšããŠãäžèšã®çããæ©èœããããšãçºèŠããŸããã
åäœããªãã®ã¯æ¬¡ã®ãšããã§ãã
afterAll(async () => {
await app.close()
})
ç§ã«ãšã£ãŠãåäœããã®ã¯--forceExit --maxWorkers=10
ã§ãïŒç§ã¯Ubuntu 18.04ã䜿çšããŠãããjest @ 21.2.1ã䜿çšããŠããŸãïŒ
ç§ã®å ŽåãNodeJS 10ãŸãã¯11ã䜿çšãããšåé¡ãä¿®æ£ãããŸãããããŒã6ãŸãã¯ããŒã8ã§ãåé¡ã¯è§£æ±ºããŸãã --detectOpenHandles
ãªãã·ã§ã³ã䜿çšããŠãäœã衚瀺ãããã --forceExit
ã§ãåé¡ãä¿®æ£ãããŸãã
ããã§ããã«+1äººïŒ @motssã@seanlindoãªã©ïŒã_ "ãã¹ãå®è¡ãå®äºããŠãã1ç§åŸã«Jestãçµäºããªãã£ãããšã確èªããŸãã" _ã¯--detectOpenHandles
ã䜿çšãããŠããªãå Žåã«ã®ã¿çºçããŸãã
--detectOpenHandles
ããªããšãã¹ãã¯äžè²«ããŠå€±æããŸããã --detectOpenHandles
å®è¡ãããšåæ ŒããéããŠãããã³ãã«ã¯è¡šç€ºãããŸããã
ãã¹ããå®è¡ãããã·ã³/ã³ã³ãããŒã«ã¯2ã€ã®ã³ã¢ããããŸãããããã©ã«ãã§ã¯ããã¹ãã¯maxWorkers=1
å®è¡ãããŸãã
--detectOpenHandles
ãã©ã°ãè¿œå ãã --debug
ãã©ã°ã䜿çšããŠconfig / globalConfigã確èªãããšã detectOpenHandles
å€ã¯_only_ã®éãã§ã...
with --runInBand --detectOpenHandles
ãå®è¡ããŠãããã¹ãã¯æ£åžžã«åæ ŒããŸãã
次ã®ããããã䜿çšããŠå®è¡ãããšãã...çµäºããŸããã§ãã...ããšã©ãŒã衚瀺ããã«ãã¹ããæ£åžžã«çµäºã§ããŸãã
jest --maxWorkers=2
jest --detectOpenHandles
jest --forceExit
ä»ã®ãšããmaxWorkers=2
ã§ãããåé¿ããŠããŸããããããã¯ç§ã®èŠ³å¯ã§ãããå°æ¥æ€çŽ¢ãã人ã®ããã ãã®ãã®ã§ã...
_ç·šéïŒè¿œå ã®è©³çŽ°ïŒããã¯ãããŒãv8.9.3ãå®è¡ããŠããalpineïŒ3.7ããã®Dockerã³ã³ãããŒã§ããCIç°å¢ã«ã®ã¿åœ±é¿ããŸãã éçºãã·ã³ã§--maxWorkers=1
ã§åçŸã§ããŸãã_
ãã®ãšã©ãŒãçºçããããšã確èªããŠããŸãã --maxWorkers=10
ã䜿çšãããšãåé¡ã解決ããããã§ãã
ã ãã....ç§ã¯ããªãé·ãéãããšæŠã£ãŠããŸããïŒtravis ciãã«ããŒãªãŒã«ãtypescriptã䜿çšïŒã
ãã³ã°ããŠãã«ãã倱æããããšã«ãªããŸãïŒãã ããTravis CIã§ã®ã¿ïŒã
å€ãã®è©Šè¡é¯èª€ã®æ«ããããä¿®æ£ããã®ã¯ããã¹ããžã®æ瀺çãªãã¹ãè¿œå ããããšã§ããã
npmã¹ã¯ãªããã§å€±æããŸãã
"test": "jest",
"test:coverage": "npm run test -- --collectCoverage && cat ./src/coverage/lcov.info | coveralls",
ãããŠãïŒtravis ciã§ïŒæž¡ãããŸããïŒ
"test": "jest .*\.test\.ts",
"test:coverage": "npm run test -- --collectCoverage && cat ./src/coverage/lcov.info | coveralls",
Redhat UBIã€ã¡ãŒãžãšcreate-react-app
dockerã䜿çšããŠããå Žåã¯ã npm test
å®è¡ããåã«CI=true
ãèšå®ããŠãã ããã
2019幎12æãTravisã§ã®ã¿ãã®åé¡ã«ééããŸããã ãã¹ãã¯ããŒã«ã«ã§åæ ŒããŸãã @qopqopqopã®ä¿®æ£ã¯ç§ã®ããã«åããã JestããŒãžã§ã³24.9.0ã®äœ¿çš
ãã®ãšã©ãŒãçºçããã®ã¯ããããžã§ã¯ããããã¯ãšãã¹ãã©ã€ãã©ãªã䜿çšããæ°ããã³ã³ããŒãã³ããè¿œå ãå§ãããšãã ãã§ãã Jestãtesting-libraryãReactããã¯ã¯ãã¹ãŠæ°ãããã¯ãããžãŒã§ããããããããã®éã«ã¯å€å°ã®æ©æŠããããšæããŸãã ãããã®ãããžã§ã¯ãã¯ããŸã ãäºãã«ããŸãéã¶æ¹æ³ãåŠãã§ããŸãã ãŸãã¯ãããã¯ãäžé©åã«äœ¿çšããéåžžã«ãã°ã®ããæ©èœã³ã³ããŒãã³ããèšè¿°ããŠããå¯èœæ§ããããŸãã :-)
ç§ã¯ãŸã ãã®åé¡ãæ±ããŠããŸãã ãã¹ããçµäºã§ããŸãããããã«ããããã¹ãŠã®ã¢ããªã§npm test
倱æããŸãã ã©ããªææããïŒ
@kooogeããŸããããªãäŸãæçš¿ã§ããŸããïŒ
ãã¹ãŠã®ãã¹ãã«åæ ŒããåŸã«ãã¹ãã0ã§çµäºããã«ã¯ã-watchAll = falseã«åæ Œããå¿
èŠããããŸãã
npm runtestã®ããã«---- watchAll = false
ããã¯ç§ã®ããã«åãã
ãããFirebaseã§æ©èœãããã«ã¯ã次ã®ããšãè¡ãå¿ èŠããããŸããã
afterAll(() => {
firebase.app().delete();
});
ãªãã·ã§ã³ã䜿çšããŠä¿®æ£ããŸããïŒ
--forceExit
https://jestjs.io/docs/en/cli# --forceexit
ã ããç§ããã®åé¡ã«ééããŸããã ãã¹ãŠã®async
åŒã³åºããæ£ããåŠçããŠããããšãç¥ã£ããšãã«ã A worker process has failed to exit gracefully and has been force exited...
èŠåã¡ãã»ãŒãžã衚瀺ãããã®ã¯é¢åasync
ã --detectOpenHandles
ãã¹ããå®è¡ããŸããããäœã衚瀺ãããŸããã§ããã 調æ»ã®çµæãç¯äººã¯Promise.race
ã
ãã€ãã£ãã®promiseãŠãŒãã£ãªãã£ã©ã€ãã©ãªïŒhttps://github.com/blend/promise-utilsïŒã䜿çšããå€éšAPIåŒã³åºãã®äžéšãtimeout
ãŠãŒãã£ãªãã£ã§ã©ããããŠããŸãã ãã®ãŠãŒãã£ãªãã£ã¯ããã€ãã£ãã®Promise.race
ãŸãã
ç§ã¯ãã®ã³ãŒããåŒãåºããçºèŠã確èªããããã®ç°¡åãªãã¹ãã±ãŒã¹ãäœæããŸããã
it('promise.race', async() => {
await Promise.race([
new Promise((res) => setTimeout(res, 10000)),
Promise.resolve('true')
])
})
ãã¹ãã±ãŒã¹ã®ã¿ã€ã ã¢ãŠãèšå®ãããã©ã«ãã§ãããšä»®å®ãããšãäžèšã®ãã¹ãã§ã¯åžžã«èŠåã衚瀺ãããŸãã
jest
ãå
éšã§éããŠãããã³ãã«ãæ€åºããããã«äœ¿çšããŠããæ¹æ³ãäœã§ããã Promise.race
ã«ãã£ãŠæå³çã«éãããŸãŸã«ãªã£ãŠãããã³ãã«ã¯èæ
®ãããŠããŸããã ãã®ãŠãŒã¹ã±ãŒã¹ã¯ééããªã誀æ€ç¥ã®ã«ããŽãªã«åé¡ãããŸãã ãã®èª€æ€ç¥ãä¿®æ£å¯èœãã©ããã¯ããããŸããããããããéçºè
ã®1人ãããã«å¯Ÿããç¬åµçãªè§£æ±ºçãæã£ãŠããŸãã
ä»ã®ãšãããç§ã¯ä»ã®ã¿ããªãšåãããã«--forceExit
ã«åºå·ããŠããŸãã
ç·šéïŒ
ãããèŠã€ããã°ããã§ãããå®éã«ã¯nodejs / v8ã®ããæ·±ãåé¡ã®ããã§ãhttps://github.com/nodejs/node/issues/24321
Firestoreãã¹ãããããã«æ¥ãä»ã®äººã«ãšã£ãŠãããã¯ç§ã«ãšã£ãŠã¯ããŸããããŸãïŒ
afterAll(async () => {
// Shut down Firestore, otherwise jest doesn't exit cleanly
await firestoreInstance.terminate()
});
ApolloïŒJestã䜿çšããŠãåãåé¡ãçºçããŸãã æ®å¿µãªããããªãã·ã§ã³--detectOpenHandles
æçµçã«çµäºããŸãããããã§ãããã»ã¹ãããã«æ°ç§éä¿çã«ãªããŸãïŒååãšã¯ç°ãªãããŸã éããŠãããã³ãã«ã«é¢ããæ
å ±ã¯æäŸãããŸããïŒã
--forceExit
æ©èœããŸãããç
©ãããå°å·ãããŸãã
Jestã匷å¶çµäºããïŒ
--detectOpenHandles
ã䜿çšããŠããã¹ãŠã®ãã¹ããçµäºããåŸãå®è¡ãç¶ç¶ããéåææäœãæ€åºããããšãæ€èšããŸãããïŒ
ç§ãèŠã€ããåé¿çïŒãããŠããã¯æ±ºããŠè§£æ±ºçã§ã¯ãããŸããïŒïŒã¯ãjest.config.jsã«teardown
ãè¿œå ããããšã§ãïŒ
globalTeardown: '<rootDir>/__tests__/teardown.js',
ãããŠteardown.jsã§process.exitã䜿çšããŸãïŒ
module.exports = async function () {
console.log('done!');
process.exit(0);
}
ç§ããã®åé¡ãæ±ããŠããŸãã ã©ãããã°ä¿®æ£ã§ããŸããïŒ forceExit: true
ã --forceExit --detectOpenHandles --maxWorkers=10
ã¯æ©èœããŸããã
https://github.com/atom-ide-community/atom-ide-base/pull/33
ç·šéïŒã©ããå¥ã®åé¡ã ç§ã䜿çšããŠããã®ã¯ãã¹ãã©ã³ããŒã§ã...
@alusicode
ããã¯ç§ã«ã¯ããŸããããŸããnpm test --watchAll=false
ããããpackage.jsonãã¡ã€ã«ã«--watchAll=false
ãè¿œå ããããšã§æ©èœããŸããã ð
ãæ°ã«å ¥ã
"test": "react-scripts test a jest --ci --reporters=default --reporters=jest-junit --watchAll=false"
å ¬åŒããã¥ã¡ã³ãïŒ https ïŒ//jestjs.io/docs/en/cli.html# --watchall
Firebaseã䜿çšããŠããŸããããã¯ãŒã¯ãããŒã¹ã¯ãªããã§åãåé¡ãçºçããŸããã ãã©ã¡ãŒã¿ãªãã§jest
ã䜿çšãããšãäžéšã®ã¹ã¯ãªãããæ£åžžã«ã·ã£ããããŠã³ããªãã£ãããã --runInBand --detectOpenHandles
ã䜿çšããå¿
èŠããããŸãã ããã§ã1ã€ãé€ããã¹ãŠã®ãã¹ãã®åé¡ãä¿®æ£ãããŸãïŒãšããã§ã --detectOpenHandles
ã¯ãåé¡ã®ãããã¹ãã衚瀺ããŸãã
ããã§ããã¹ãŠã®ãã¹ãã1ã€ãã€ãã§ãã¯ãå§ããŸããã 2ã€ã®ãã¹ãã§ãéåæé¢æ°ãåŒã³åºããšãã«await
ã䜿çšããã®ãå¿ããŠããããšãããããŸããã
åŸ
æ©ãè¿œå ããåŸãä¿®æ£ãããŸããã --detectOpenHandles
ãåé¡ãå°å·ããªãã®ã¯æ®éã ãšã¯æããŸãããã
æãåèã«ãªãã³ã¡ã³ã
èªãã§ãã人ã¯èª°ã§ã
--forceExit
ãã©ã°ã䜿çšããŠãã®æ©èœã«ã¢ã¯ã»ã¹ã§ããŸãã ð