ãã®ïŒ
before(done => {
return Promise
.all([])
.then(() => Model.insert(...)) // Bookshelf model returning a Bluebird Promise
.then(() => done())
.catch(done)
})
ãšã©ãŒãçºçããŸãError: Resolution method is overspecified. Specify a callback *or* return a Promise; not both.
ããã¥ã¡ã³ãã«ãããšïŒ
Mocha v3.0.0以éã§ã¯ãPromiseãè¿ããdoneïŒïŒãåŒã³åºããšãäŸå€ãçºçããŸããããã¯äžè¬çã«ééãã§ããããã§ãã
ã¢ãã«åŒã³åºãã¯ãæ°ããæ¿å
¥ããããšã³ããªã®Promise.<Object>
ã§è§£æ±ºãããŸããã .then(() => done())
ãçç¥ãããšããã¹ããã¿ã€ã ã¢ãŠãããŸãã
async
é¢æ°ïŒããã«ïŒãšdone
ãç ŽããŸãã
ãšã©ãŒã瀺ãããã«ãã¢ãªãã£ã0ãã倧ããé¢æ°ïŒ done
ã³ãŒã«ããã¯ãåãå
¥ããããšãæå³ããŸãïŒãæäŸããããšã¯æ³å®ãããŠããŸããããããŠãPromiseãè¿ããŸãã
ãããä¿®æ£ããæãç°¡åãªæ¹æ³ã¯ã return
ãçç¥ããããšã§ãããpromiseã䜿çšããŠããããã代ããã«done
ã³ãŒã«ããã¯ãåé€ããããšããå§ãããŸããããã«ãããæ§æãã¯ããã«åçŽã«ãªããŸãã ïŒ
before(() => Promise.all([]).then(() => Model.insert(...)));
async
ïŒåºæ¬çã«ã¯promiseïŒãšdone
ã®äž¡æ¹ãå£ããäŸã次ã«ç€ºããŸãã
it('fires change event when calling blah.doSomethingThatFiresChange', async function (done) {
const blah = await getBlah()
blah.on('change', () => done())
blah.doSomethingThatFiresChange()
})
@eladoããã¯èå³æ·±ããŠãŒã¹ã±ãŒã¹ã§ãããmochaã®èŠ³ç¹ããã¯åãç¶æ³ã§ããã€ãŸãã done
ã³ãŒã«ããã¯ãåãåããpromiseãè¿ãé¢æ°ã§ãã ç§ã¯ãããå®å
šã«çŽæããŒã¹ã«ãªãããã«æžãçŽããŸãïŒ
it('fires change event when calling blah.doSomethingThatFiresChange', async function () {
const blah = await getBlah()
return new Promise(resolve => {
blah.on('change', resolve)
blah.doSomethingThatFiresChange()
})
})
...ããããããªããåŸãŠããã®ã¯ããã®äŸã§ã¯ãã¢ã«ãçŽæã解決ãããã³ãŒã«ããã¯ãåŒã³åºãããã®ã_äž¡æ¹_åŸ ã€æ¹ããããšããããšã ãšæããŸããïŒ
æ®å¿µãªããããã®ç¹å®ã®ã³ã³ãã¯ã»ãšãã©ã®å Žåãã¹ãã®ãã°ã§ããããããã®ãšã©ãŒã¡ãã»ãŒãžãæåã«è¿œå ãããŸããã
... .thenïŒïŒïŒ=> doneïŒïŒïŒãçç¥ãããšããã¹ããã¿ã€ã ã¢ãŠãããŸãã
ãããã«ãããããã¯ãã°ã®ããã§ãã
@ScottFreeCodeããŒããããã done
ã³ãŒã«ããã¯ãšããŠæäŸãããé¢æ°ã§ãéå°æå®ããšã©ãŒãçºè¡ããããããšæãããŸãïŒ https ïŒ ïŒL357 -L373
...ããããã¡ãããé¢æ°ãæ»ã£ããããã«ãã®ãšã©ãŒã§å€±æããå¿ èŠããããšå€æã§ããŸãã
@ScottFreeCodeããã§ã®ä¿®æ£ã¯äœã§ããïŒ
ãçŽæã解決ãŸãã¯æåŠãããã®ãåŸ ã£ãŠããããéå°æå®ããšã©ãŒã§æåŠããããšæšæž¬ããŸããïŒ
åããã¹ãã§done
ãšpromiseããšã©ãŒãšèŠãªãå Žåã done
åãåã£ããã¹ãé¢æ°ããšã©ãŒãè¿ããšããã«ãšã©ãŒãæ€åºããªãçç±ã¯ããããŸããã @papandreouã瀺åããããã«ãçŽæããŸãã å Žåã«ãã£ãŠã¯promiseãšdone
äžç·ã«èš±å¯ããã€ããããªãéããä»ã®ã©ã®ãã€ã³ãããšã©ãŒãããªã¬ãŒããããç解ããããšããããšã¯ç§ã«ã¯ããŸãæå³ããããŸããã
@ScottFreeCodeç§ã¯åæããŸãã ã£ãŠããããšã¯
Error
ãããåŒã³åºãããšã¯ãããŸããdone()
ããã§Error
æåŠããããŒãã¹è³ªåïŒçŽæã®å±¥è¡ã®çµæãã©ããããïŒ
ãããç§ã¯ãããç解ãããšæããŸã-ãšã©ãŒãæ€åºããå Žåã§ãããã¹ããå®è¡ããŠã次ã®ãã¹ãäžã«ã³ãŒããå®è¡ãããªãããã«ããå¿ èŠããããŸããããããããã¹ãçµæãå ±åããããšãã§ããŸãã
ãã¹ãã¯ãçŽæã解決ãŸãã¯æåŠããã«done
ãåŒã³åºãããšã«ãªãå¯èœæ§ããããŸããïŒ ãããããªããããã¯ç§ãã¡ãåŠçããªããã°ãªããªãããäžã€ã®ãšã³ãã±ãŒã¹ã§ãã
ç§ã®åŸåãåã ãã¹ãã®çµæãã©ãããããšãããšãã¿ã€ã ã¢ãŠãããå ŽåïŒ done
ãåŒã³åºãããpromiseã解決/æåŠããã«ïŒãpromiseã§done
ã®äœ¿çšãå ±åããã ãã§ãã ïŒçµã¿åããã«é¢ããæ··ä¹±ããã©ã¡ãã«ãå°éããã代ããã«ã¿ã€ã ã¢ãŠãã«ãªã£ãçç±ã§ããå¯èœæ§ãéåžžã«é«ãããïŒããããããã®æ¹æ³ã§çµäºã§ããå Žåã¯ãããããçµæã¯æå¹ïŒãŸãã¯å°ãªããšãäœããã®æå³ãããïŒã§ãããå ±åããå¿
èŠããããŸãdone
誀ã£ã䜿çšã®å¯èœæ§ãšäžç·ã«çŽæããããšããããŠãããå°ãªããšãããçšåºŠåœ¹ç«ã€ããšãæåŸ
ãããã¹ãçµæã®äž¡æ¹ã
ãšã«ãããããã¯ç§ãçŸæç¹ã§æãã€ãããšãã§ããæé«ã®ãã®ã§ããããã®åé¡ãæãäžããæéãèŠã€ããããšãã§ããã°ãç§ã¯ããå€ãã®æŽå¯ãåŸããããããŸããã
ããã§ãããããã¯æ®µéçã«è¡ãããšãã§ããŸãã 1ã€ç®ã¯ãPromiseãè¿ããã done
ã³ãŒã«ããã¯ãäžããããå Žåã«ãMochaãå奜çã«å£ããããšã確èªããããšã§ãã
ïŒBluebirdã䜿çšããŠïŒæ¬¡ã®ãããªããšãã§ããã®ã¯_èããããŸã_ïŒ
// to make this work, you need to omit `return`
it('should do something async for sure', function(done) {
return somethingAsync()
.then(makeAssertion)
.asCallback(done);
});
ããããããã¯ããªãã_ã§ãã_ããšã§ãã ç§ã¯ããã®ãŠãŒã¹ã±ãŒã¹ããŸã 決å®ããŠããŸããã
ç§ã¯èªåèªèº«ãæ··ä¹±ããããšæããŸãã ããã«ãã°ããããã©ããã¯ãŸã£ããããããŸããã
ããã¯ã貧匱ãªUIãã¿ã€ãã®åé¡ã§ã
è¿ãããpromiseã解決/æåŠãããŠãã done
ãåŒã³åºãããã®ãåŸ
ã€ã¿ã€ã ã¢ãŠãã¯ããã®ãããªãã¹ãã§done
ãšpromiseãäžç·ã«äœ¿çšããããšãçŠæ¢ãããã©ããã«é¢ä¿ãªããééããªããã°ã§ããå Žæã ããã¯ãpromiseãšdone
äž¡æ¹ãåããã¹ãã§äœ¿çšããããããpromiseãŸãã¯ãšã©ãŒã®çµæã䜿çšããå¿
èŠããããŸãããäžæ¹ãå®äºãããšãã«äžæ¹ãå®äºããªãã£ãããã«ã¿ã€ã ã¢ãŠãããã ãã§ã¯ãããŸããïŒãããçŸåšè¡ã£ãŠããããšã§ãïŒïŒ
it("should not time out", function(done) {
return new Promise(function(resolve, reject) {
setTimeout(resolve.bind(42), 50)
})
})
1ïŒã¿ã€ã ã¢ãŠãããªãã§ãã ããïŒ
ãšã©ãŒïŒ2000msã®ã¿ã€ã ã¢ãŠããè¶ ããŸããã ãã®ãã¹ãã§doneïŒïŒã³ãŒã«ããã¯ãåŒã³åºãããŠããããšã確èªããŸãã
ãšã«ããPRãèŠãŠãããŸã...
èå³ã®ããæ¹ã¯ïŒ2413ãã芧ãã ããã
@briansipple
ããŒãžã§ã³3ã§è€æ°ã®éåæbeforeEach
ããã¯ã䜿çšãããšãåããšã©ãŒãçºçããŸãã
beforeEach((cb) => connection.db.collection('users').remove({}, cb));
beforeEach((cb) => connection.db.collection('accounts').remove({}, cb));
beforeEach((cb) => connection.db.collection('accounts').insertOne(account1, cb));
ãã®ããã«éåæããã¯ããŸã 䜿çšããããšã¯ã§ããŸãããïŒ
ç§ã¯èªåã®åé¡ãç解ããŸããïŒåããã¯å
ã®ã¡ãœãããpromise
è¿ãïŒãã®ãããªå Žåã¯promiseã䜿çšããŠããªãã£ãããããããç¥ããŸããã§ããïŒãæããã«cb
é¢æ°ãæž¡ããŠããŸãã
ããã¯è¯ãèãã§ã¯ãªããšæããŸãã ã³ãŒã«ããã¯ããªã¯ãšã¹ãããå Žåã圌ãã¯åœŒãã®æå³ãæ確ã«ãããšæããŸãã ããã§ã®ãšã©ãŒã¯ãã ã®ç ©ãããã§ãã åãå€ããŠãã ããã
ããã¯å®éã«ã¯æå³çãªåé¡ã§ã¯ãããŸããã ïŒ1320ã®èª¬æããïŒ
ã³ãŒã«ããã¯é¢æ°ãæå®ãããPromiseãªããžã§ã¯ãã
è¿ããããšãRunnableã®è§£æ±ºæ¡ä»¶ã¯ãããŸãã§ãã
ãããŸãã§ã¯ãããŸãããã³ãŒã«ããã¯ãèŠæ±ãããŸããã ããã¯ã©ã®ããã«ææ§ã§ããïŒ
@RobertWHurstã«ãããŸããããªãããšã«åæããŸãã
ããã«å ããŠããã®åé¡ã¯ãæèŠã«åºã¥ãããã®ã§ããå¯èœæ§ããããéçºè ã¯ç°ãªãèŠè§£ãæã£ãŠãããšæããŸãã ç§ã¯ãããå£æ» çãªå€åããã人ã ã«ãã®ããã«äœ¿ãããããšã¯éåžžã«éæ¿ã§ãããšæããŸãã
ç§ãã¡ã¯èª°ã«ãäœãããããšã_匷å¶_ããŸããã§ããã ã¡ãžã£ãŒããªãªãŒã¹ããŸããããããã¯å®çŸ©äžãé倧ãªå€æŽãå ããããŸãã ç§ãã¡ã¯semverãå£ããŸããã§ããã
圌ã¯ããªããã»ã³ããŒãå£ãããšããæå³ã§ã¯ãªããšæããŸãã圌ã¯ããªããã¢ã«ãå£ãããšããæå³ã ãšæããŸãã ãã®å€æŽã¯éçºè ã«ãšã£ãŠç©äºã容æã«ãããã®ã§ã¯ãªããæèŠã匷å¶ãããã®ã§ãã
beforeEach((cb) => connection.db.collection('users').remove({}, cb));
^^
^^ããã¯ææ§ã§ã¯ãããŸããã èè ãäœãæåŸ ããŠããã®ãã¯ããªãæ確ã§ãã äœè ã¯ãã³ãŒã«ããã¯ãèŠæ±ããããã«éªéãããŠããŸããã
å®éãããã§äŸå€ãçºçããçç±ã¯ãæèŠã匷å¶ããããšãæ倧éã«åé¿ããããã§ãã ã¢ã«ã¯ãè¿ãããçŽæãŸãã¯ã³ãŒã«ããã¯ãä¿¡é Œã§ãããã©ããã«ã€ããŠæèŠãæã£ãŠããŸããã çµæããããŸãã«ãªããããäž¡æ¹ãåæã«äœ¿çšããããšã¯ã§ããŸããã ãã¹ããã¬ãŒã ã¯ãŒã¯ã§ã®ãããŸããªçµæã¯ããšã©ãŒãšèŠãªãå¿ èŠããããŸãã ãããã£ãŠããããèªèããèªåã®æèŠã«äžèŽããéžæãšå€æŽãè¡ãã®ã«åœ¹ç«ã€ãšã©ãŒã¡ãã»ãŒãžã衚瀺ãããŸãã
ãã©ãã®éãæžããããšã¯æçãããããŸããã ãããªãã¯ã¢ã«ãå£ãããã¯èª°ãå©ããŠããŸããã semverã®ã¡ãžã£ãŒããŒãžã§ã³ã®å¢å ã¯ãã³ãŒãã®èª¿æŽãå¿ èŠã«ãªãå¯èœæ§ã®ããé倧ãªå€æŽãšããŠæ瀺çã«å®çŸ©ãããŠããŸãã 2.xã«ãšã©ãŸãããã¹ããä¿®æ£ããããã®å€æŽãå ããæéãäžããããšãã§ããŸãã ããã¯é²åã§ãããç Žæã§ã¯ãããŸãã
@Munterã³ãŒã«ããã¯ã®ãªã¯ãšã¹ããã©ã®ããã«ææ§ã§ãããã«ã€ããŠãç§ã¯ãŸã æ®ããŠããŸãã ã³ãŒã«ããã¯ãèŠæ±ããå Žåã¯ãããã䜿çšããå¿ èŠããããŸãã ãã以å€ã®å Žåã¯ãããã°ã©ãã³ã°ãšã©ãŒã§ãã ããã¯ããã¹ãäœæè ã«ããæ瀺çãªã¢ã¯ã·ã§ã³ã§ãã
ããªãããã©ããæããŠãããªããç§ã¯äœãæå³ããŸããã ãããªãã¯ã¢ã«ãå£ãããã¯åæ²ç·ãæå³ãããã®ã§ã¯ãããŸããã ããã¯ã¢ãžã¥ãŒã«ã®èšèšã«åããå ã®APIã³ã³ãã©ã¯ããç ŽããšæããŸãã
åã«è¿°ã¹ãããã«ãbabel async / awaitã¯æ°ããmocha @ 3ã§ã¯ããŸãæ©èœããŸãã
it('should fill userName and password', async function (done) {
const userNameField = global.driver.wait(until.elementLocated({css: '#username'}));
userNameField.sendKeys('admin');
const passNameField = global.driver.findElement({css: '#password'});
passNameField.sendKeys('*******');
const userNameVal = await userNameField.getAttribute('value');
const passwordVal = await passNameField.getAttribute('value');
try {
assert.equal(userNameVal, 'admin');
assert.equal(passwordVal, 'changeme');
} catch (error) {
done(error);
return;
}
done();
});
ãã®ã³ãŒãã¯mocha @ 2ã§ããŸãæ©èœããŸããã await
ã§ã¯promiseãè¿ãããã mocha @ 3ã§ã¯æ©èœããŸããã
ãã®PRã¯ããã«é¢é£ããŠãããšæããŸã=> https://github.com/mochajs/mocha/pull/2413
ãã®ãšã©ãŒã®ãšããžã±ãŒã¹ã«å¯ŸåŠããããã®ããè€éãªã
@artyomtrityakããã¯ã done
ãäžèŠãªè¯ãäŸã§ãã
äžå·è ã¯åœŒãã®äœåãèšã£ãŠããŸãã ããã§ããã¢ã«ã®ã¡ã³ããã¯ããã®å€æŽãå ã«æ»ãããã®è°è«ã«åæããŸããã ãšã©ã³ã»ãã³ããŒã¯ïŒèšãæããã°ïŒãã¡ã³ãããŒãšããŠãããªããã§ããæãé£ããããšã®1ã€ã¯ãä»äºãèªåã®æ¹åã«åãããã人ã倱æãããããšã§ãããšè¿°ã¹ãŸããã
ããå€ãã®ããã¥ã¡ã³ãïŒããšãã°ããã®ãšã©ãŒã®ããå€ãã®äŸãšããããä¿®æ£ããæ¹æ³ïŒãããè¯ããšã©ãŒã¡ãã»ãŒãžãªã©ã®åé¿çãæè¿ããŸããããã©ããç¡ç€ŒããŸãã¯äžæºã«ã¯èå³ããããŸããã ãããã®åé¿çã®ãããããMochaã«æäŸãããšããã¬ãã£ããããžãã£ãã«å€ããã®ã«åœ¹ç«ã¡ãŸãã
ãã®å€æŽãæ°ã«å ¥ãããåã«å»ºèšçã«ã§ããªãå Žåã¯ãOSSã§ãããããžã§ã¯ãããã©ãŒã¯ããŠãããã§å€æŽãå ã«æ»ãããšãã§ããŸãã
@boneskullã¯ãpromiseãè¿ãéåæé¢æ°ã«å€æãããŸãmocha @ 2ã§å®å šã«æ©èœããŸããã mocha @ 3ã§ã¯æ©èœããŸããã ãã®ãããç§ã®ããŒã ïŒã20pplïŒã¯ææ°ã®ã¢ã«ã«ç§»åã§ããŸããã
çŸåšãmocha 2.xã¯å€ãã®æè»æ§ãæäŸããŸããããã®å€æŽã®æè¡çãªçç±ã¯ãããŸããïŒ
@artyomtrityakããã¯ãå®äºãäžèŠãªå Žæã®è¯ãäŸã§ãã
ãããbabel async/await
æ§æã䜿çšãã return new Promise
ã䜿çšããªãå Žåã®äŸãæããŠãã ããã
@artyomtrityakçŽæãå®å šã«
it('should fill userName and password', async function () {
const userNameField = global.driver.wait(until.elementLocated({css: '#username'}));
userNameField.sendKeys('admin');
const passNameField = global.driver.findElement({css: '#password'});
passNameField.sendKeys('*******');
const userNameVal = await userNameField.getAttribute('value');
const passwordVal = await passNameField.getAttribute('value');
assert.equal(userNameVal, 'admin');
assert.equal(passwordVal, 'changeme');
});
å人çã«æ»æãããŠãããšæããå Žåã¯ããã®äŒè©±ã«ã©ãã ãææ çã«æè³ããŠããããåèããå¿ èŠããããšæããŸãã ã³ã¡ã³ãã¯ã©ããå人çãªãã®ã§ã¯ãããŸããã ç¹ã«ããã®ãããžã§ã¯ãã®ç¶æã«æéãè²»ãããŠãã ãã£ãããšãèãããšãçããã¯çŽ æŽããããšç¢ºä¿¡ããŠããŸããããã¯éåžžã«é«ãè©äŸ¡ãããéåžžã«ç§°è³ã«å€ããŸãã
ããªãã®ã»ãšãã©ïŒçŸåšã¢ã¯ãã£ããªã¡ã³ããïŒã¯ã2014幎åã°é ã«ã¢ã«ã«åãçµã¿å§ããŸããã ã¢ã«ã¯çãããè²¢ç®ãå§ããæç¹ã§ãã§ã«ç¢ºç«ãããŠããŸãã ããã¯ç§ã®æèŠã§ãããæ£åœåãããªãéãã確ç«ãããã©ã€ãã©ãªã«é倧ãªå€æŽãå ããã¹ãã§ã¯ãªããšèããŠããã®ã¯ç§ã ãã§ã¯ãªããšæããŸãã ãã®å€æŽã®æ¬æ¥ã®æ£åœæ§ã¯æ³åã§ããŸããã次ã®ç¹ãææãããšããŸããããŸããã ã³ãŒã«ããã¯ãèŠæ±ããããšã¯ãæ確ãªæå³ãäŒããŸãã çŽæã¯èŠæ±ãããŠããªãããæ確ã§ã¯ãªããè¿ãããŸããããã¯éæ¥çãã€å¶çºçã«çºçããå¯èœæ§ããããŸãïŒããšãã°ããµãŒãããŒãã£ã®ã©ã€ãã©ãªããè¿ãããŸãïŒã ãããã®éãã®ããã«ã2ã€ã®éäŒæ¹æ³ã¯çãããªãããããã£ãŠäž¡æ¹ã䜿çšããããšããããšã¯å®éã«ã¯ææ§ã§ã¯ãããŸããã ã³ãŒã«ããã¯ã¯ãã¹ãåŒæ°ã«æžã蟌ãå¿ èŠããããŸãã çŽæã§ã¯ãããè¡ãããšã¯ã§ããªãã®ã§ãã³ãŒã«ããã¯ãèŠæ±ããããšã§ãæå³ãæ瀺çã«äŒããŸããã ããªãã®ã³ãã¥ããã£ã¯ãããã®æžå¿µãæèµ·ããŸããããããŠããªããã¡ã倱æãèªãã代ããã«ããªããã¡ã¯åå¢ããŠããŸãã ãã®ãšã©ãŒãäžè²«ããŠæ©èœããããšã確èªããããã«ããã¹ãã匷å¶çã«éåæã«ããããšãæ€èšããŠããããã§ãã => https://github.com/mochajs/mocha/pull/2413ãåç §ããŠ
@tjã®åºçºä»¥æ¥ã
@RobertWHurstã«å®å šã«åæããŸãã
done
ãèŠæ±ãããšãè¿ãããpromiseã®åäœãäžæžããããŸãã äžèŠãªãšãã«done
ãèŠæ±ããå¯èœæ§ã¯äœãã async
é¢æ°ã§çºè¡ãããã€ãã³ãã®ã·ããªãªã¯å®ç§ãªäŸã§ãã
äžèšã®ç§ã®ã³ã¡ã³ãããïŒ
it('fires change event when calling blah.doSomethingThatFiresChange', async function (done) {
const blah = await getBlah()
blah.on('change', () => done())
blah.doSomethingThatFiresChange()
})
ããå€ãã®äººã
ãES6 / 7 + async
/ await
ã«ç§»è¡ããã«ã€ããŠãããã¯Mochaã䜿çšããéã®äžè¬çãªèœãšãç©Žã«ãªããŸãã
ãã®å€æŽãåæ€èšããŠãã ããã
@RobertWHurst done
ã³ãŒã«ããã¯ãå®çŸ©ããããšã¯æ瀺çãªæå³ã§ãããšããªãã¯äž»åŒµããŸãã return
ã¹ããŒãã¡ã³ãã¯æ瀺çãªæå³ã§ã¯ãããŸãããïŒ ã©ã¡ããã³ãŒãã§å®çŸ©ãããŠããŸãã ã³ãŒãã®äžéšãæå³çã§ãããå¥ã®éšåãæå³çã§ã¯ãªããšã©ã®ããã«å€æã§ããŸããïŒ () => foo
ããåã®äžçãæ³åãããšãreturnã¹ããŒãã¡ã³ãã¯åžžã«æ瀺çã§ããã ããªããä»è
ãçµãã§ããå¯äžã®çç±ã¯ãããªããæé»ã®returnã¹ããŒãã¡ã³ãã䜿ãå§ããããã§ããç§ãèããããšãã§ããã®ã¯çŸççç±ã ãã§ãã
Mochaã®äœ¿çšæ³ã®å€ãã¯ãéåžždone
ã³ãŒã«ããã¯ãå«ãå¯èœæ§ãé«ãäŸãã³ããŒããŠè²Œãä»ããåå¿è
ã«ãããã®ã§ãããšãããšããã®æ°ãããŠãŒã¶ãŒãæ瀺çã«promiseãè¿ããããã¿ã€ã ã¢ãŠããçºçããå Žåãã©ã®ããã«åŠçããŸããïŒ ããã¯ãæ°ãçã£ãŠããå€æŽãå
ã«æ»ãããå Žåã®çµæã§ãã
çŸåšã®åäœã¯ãäºæããªãã¿ã€ã ã¢ãŠãããããäœãåé¡ã§ãããã«ã€ããŠã¯ããã«æ確ã§ãã
@Munterç»åã«async
é¢æ°ãããå Žåã await
ã䜿çšãããã©ããã«é¢ä¿ãªããèªåçã«äœæãããŠè¿ããããããè¿ãããpromiseã¹ã³ã¢ã¯æ瀺æ§ã¹ã±ãŒã«ã§äœããªããšæããŸãã
it('should work with a async function that could have been sync', async function () {
assert.ok(true);
});
it('should work with a legitimately async function', async function () {
assert.equal(await getBlah(), 'blah');
});
it('should work with a fully spelled-out Promise-based test', function () {
return getBlah().then(function (blah) {
assert.equal(blah, 'blah');
});
});
ãããŠãç©è°ãéžããã®ããããŸãïŒ
it('should foo', async function (done) {
assert.equal('foo', 'foo');
done();
});
ãŸãããã®å°ããªasync
ã誀ã£ãŠäŸµå
¥ããã®ãç°¡åãªã®ã§ã @ eladoãææããŠããããã«ãïŒå°ãªããšãïŒæåã®äŸãæ°ããçš®é¡ã®
ããã§å°ã話ãåã£ãåŸ=> https://github.com/mochajs/mocha/pull/1320ãç§ã¯åé¡ã®ä»£æ¿ãœãªã¥ãŒã·ã§ã³ã®ã¢ã€ãã¢ãæãã€ããŸããã ããã«ããªãã®ã¬ãã¥ãŒã®åã³ã®ããã®PRãè¿œå ããŸãã=> https://github.com/mochajs/mocha/pull/2454
ïŒããŒã«ïŒ
å®äºããã³ãŒã«ããã¯ãå®çŸ©ããããšã¯æ瀺çãªæå³ã§ãããšããªãã¯äž»åŒµããŸãã returnã¹ããŒãã¡ã³ãã¯æ瀺çãªæå³ã§ã¯ãããŸãããïŒ
@Muntercoffeescriptãšes6ã®ç¢å°é¢æ°åŒã_implicitly_ãè¿ãããšãå¿ããªãã§ãã ãããããããã°ã次ã®ãããªããšãã§ããŸãã
it 'should foo', (done) -> request('/foo').end (err, res, body) -> done()
ããªãã¯å®å šã ãšæããŸãã ãããããã®åé¡ã¯ããã®çŽ æµãªã¯ã³ã©ã€ããŒã次ã®ãããªãã®ã«å€æããå¿ èŠãããããšãæå³ããŸã
it 'should foo', (done) ->
request('/foo').end (err, res, body) -> done()
return
ããã¯ãŸãã«ããããããšmecanoã®å šäœçãªã³ãŒãããŒã¹ã«é¢ããåé¡
it 'should foo', (done) ->
obj =
run: ->
done()
@
then: -> "what the hell, i'm not a promise"
obj.run()
ããã¯coffeescriptã«å®å šã«åºæã§ã¯ãããŸããããæé»ã®å€ãè¿ããšææªã«ãªããŸãã Mochaã¯æå¹ãªpromiseã€ã³ã¹ã¿ã³ã¹ãæ€åºããå¿ èŠããããŸãã ãŸãããªãã·ã§ã³ã§ãã®æ©èœãç¡å¹ã«ããããšãã§ããŸãã
ããã¿ããªã
次ã®ã³ãŒãã§ãã®åé¡ã«ééããŸããã
describe('Page', ->
describe('/GET home', ->
it('it SHOULD return the homepage', (done) ->
chai.request(app).get('/').end((err, res) ->
res.should.have.status(200)
res.text.should.be.a('string')
done()
)
)
)
)
promiseãã§ãŒã³ãå°éããã³ãŒã«ããã¯done()
ãçç¥ããããšã§ãããã解決ããŸããã
describe('Page', ->
describe('/GET home', ->
it('it SHOULD return the homepage', ->
chai.request(app).get('/').then((res) ->
res.should.have.status(200)
res.text.should.be.a('string')
)
)
)
)
ããããåæ§ã®ãšã©ãŒã«ééããä»ã®äººã«åœ¹ç«ã€ããšãé¡ã£ãŠããŸãïŒsmileïŒ
PS ïŒheartïŒMocha btwïŒ+1ïŒ
ç·šé@Munterã®ã³ã¡ã³ãã«åºã¥ããŠcatch()
ãåé€ããŸãã
@karlbatemanããããšãã ãã ããæåŸã®.catch
ã¯å¿
èŠãããŸããã æåŠãããçŽæã¯ãã¢ã«ã«ãã£ãŠãšã©ãŒãšããŠã«ãŠã³ããããŸã
@Munterãªãã»ã©ãããããšãïŒsmileyïŒ
ããå°ãèããŠã¿ããšãçŽæãšã³ãŒã«ããã¯ã®äž¡æ¹ãåŸ ã€ãšããæ¯ãèããæ¬åœã«å¥œãã§ãã ãããå®è£ ããããšã§äœãé²æ©ã¯ãããŸãããïŒ
@ light24bulbsãã£ãŒãããã¯ãããããšãïŒ ããããããã¯ç§ãåå¿ãèŠãããã«ããã«æã蟌ãã åãªãã¢ã€ãã¢ãªã®ã§ã誰ãããã«åãçµã¿å§ããŸããã§ããã ç§ã¯ã¡ããã©ä»ãã¢ã€ãã¢ã«ã€ããŠè¿œå ã®ãã£ãŒãããã¯ããã£ããã©ããããããæ©èœããªãå Žåãªã©ããããã©ããã確èªããŠããŸããã
babelã䜿çšããå Žåã®åé¿çã¯ãããŸããïŒ
babelã䜿çšããå Žåã®åé¿çã¯ãããŸããïŒ
ç§ã¯2åã©ããããŸãïŒ
it("should work", done => {
(async () => {
await something;
done();
})();
});
@SaschaNazããããšããããã¯v3.2.0ã§åäœããŸã:)
6ãæåŸããã®åé¡ã¯ãŸã ãã¹ãŠã®ææ°ã®jsãã¹ãã«ãã¬ãŒãããããŠããŸã...
æ¥
@benfavreãã©ã³ãã£ã¢ãåäŸãšéã¶ã®ã§ã¯ãªããèªç±ãªæéã«æå®ããŠããªããœãªã¥ãŒã·ã§ã³ãå®è£ ãã責任ãè² ãããã«ãæã確å®ã«
@Muntermochajsã®æ°èŠãŠãŒã¶ãŒãšããŠçŽé¢ããç¹å®ã®åé¡ãç¹å®ããã®ã«åœ¹ç«ã€ããšãå¬ããæããŸãã
@SaschaNazã¯ã2åã©ããã³ã°ãããœãªã¥ãŒã·ã§ã³ã¯
=> promiseãæä»çã«äœ¿çšãããšãæ£åžžã«æ©èœããŸããã
次åã¯ãç¡æã§äŸ®èŸ±ãããªãããã«ãã¢ãã³ã®ããã«ã+1ãããã ãã§ãããšæããŸãã
ç§ã®ã¡ãã»ãŒãžã«ã¯äŸ®èŸ±çãªãã®ã¯äœããããŸããã§ãããããã«ç§ã®çºèšã¯çå®ã®ãŸãŸã§ãã
ã»ãšãã©ã®äººã¯å¥ã®ãã¬ãŒã ã¯ãŒã¯ãéžæããã§ããã...ä»ã®ãšãããããã¯async / awaitã§åçŽã«å£ããŠãããã¡ã€ã³ãµã€ãã®ã©ãã«ãæ確ãªè¡šç€ºããªããCLIã«æ確ãªãšã©ãŒã¡ãã»ãŒãžããããŸããã
æããŸããŠããã§ãšãããããŸããåäŸãã¡ãšéãã§æ¥œããã§ãã ããã
ãã«...
ãã£ã¹ã«ãã·ã§ã³ã¯ã done
ã³ãŒã«ããã¯ãšè¿ãããPromise
äž¡æ¹ã«ã泚æãæããããšã«çºå±ããŸããïŒ https ïŒ
ééã ïŒ2509ãåç §
äžéšã®äœããŸã èŠåŽããŠããå Žå...
babelã䜿çšããå Žåã®åé¿çã¯ãããŸããïŒ
ïŒ2509ã§è¿°ã¹ãããã«ãpromiseã®çµã¿èŸŒã¿ãã³ãã©ãŒã䜿çšãããšã次ã®ããã«wrapping twice hack
ã䜿çšããå¿
èŠã¯ãããŸããã
it("should work", done => {
(async () => {
await something;
done();
})();
});
ãã®ä»£ããã«ãç§ãã¡ã¯ããã§ç°¡åã«è¡ãããšãã§ããŸãïŒ
it("should work", async () => {
await something;
});
詳现ã«ã€ããŠã¯ããã®æçš¿ã確èªããŠãã ãã
@ lo-tp
1.ïŒãã®ã³ãŒãã¯babelã§ã³ã³ãã€ã«ãããšæ©èœããŸããïŒ
it("should work", async () => {
await something;
});
@SerkanSipahi
async/await
æ§æã䜿çšããã«ã¯ãbabelã®å©ããå¿
èŠã§ããäœãã足ããªããã©ããã¯ããããŸãã...ããããPromisesã§returnã¹ããŒãã¡ã³ãã䜿çšãããdoneïŒïŒã«äŸåããããšã§ããã®åé¡ã解決ããŸããã
ãããç§ã®ããã«åããŠããäŸã§ã
describe('STRIPE CHARGES: Get Charges', () => {
it('should list customer charges', async () => {
const charges = await Stripe.getChargesList(customerObj);
charges.data[0].should.have.property('id');
charges.data[0].amount.should.have.property('id');
});
});
ç§ã¯chai.assertã§mocha4ã䜿çšããŠããŸãã
æåã¯ãdoneïŒïŒã³ãŒã«ããã¯ããã®ããã«äœ¿çšããããšããŸããã
it('should throw an error', async function(done) {
try {
result = await something('value that causes something() to throw an Error');
done('failed');
} catch (e) {
done();
}
});
ããã¯å€±æããŸãã
Error: Resolution method is overspecified. Specify a callback *or* return a Promise; not both."
ãã®ãšã©ãŒãç§ãããããã®ããŒãžã«å°ããã®ã§ãã ãã®ããªãé·ãã¹ã¬ããããããæããŠïŒãããŠç§ã¯ãã¹ãŠã®è«äºãå®å šã«ç解ããŠããªãã£ãããšãèªããŸãïŒããããã¯PromisedããŒã¹ã§ãããããéåæåŒã³åºãã§doneïŒïŒã䜿çšããã¹ãã§ã¯ãªãããšãç解ããŠããŸããïŒ
ãããããªããsomethingïŒïŒãåŸ ã€ããã®åŒã³åºãããšã©ãŒãã¹ããŒãããšãã«æ¬¡ã®ãã¹ãã«åæ Œããã«ã¯ã©ãããã°ããã§ããïŒããã¯ç§ãèµ·ãããšäºæ³ãããããšã§ããïŒ
it('should throw an error', async function() {
try {
result = await something('value that causes something() to throw an Error');
} catch (e) {
// how to indicate that this should happen, if I can't call done() to tell mocha?
}
});
誰ããç§ããã®ç¹å®ã®ã±ãŒã¹ãç解ããã®ãæäŒã£ãŠãããŸãããïŒ ã¢ãµãŒã·ã§ã³ã©ã€ãã©ãªã䜿çšããå¿ èŠããããŸããããããšãäžèšã®ã³ãŒãã«è¿œå ããå¿ èŠããããã®ããããŸããïŒ
ã©ããããããšãã
äœã¬ãã«ã§ãšã©ãŒãçºçãããããœãªã¥ãŒã·ã§ã³ïŒ
it('should throw an error', async function() {
try {
result = await something('value that causes something() to throw an Error');
throw new Error('Promise unexpectedly fulfilled');
} catch (e) {
// Optionally assert something about e...
}
});
ç§ã¯ææ¥ãåããã¢ãµãŒã·ã§ã³ã©ã€ãã©ãªã䜿çšããŸãã
const expect = require('unexpected');
it('should throw an error', async function () {
await expect(something(), 'to be rejected with', 'the error message');
});
ãŸãã¯chai + chai-as-promisedïŒ
const chai = require('chai');
chai.use(require('chai-as-promised'));
const expect = chai.expect;
it('should throw an error', async function () {
await expect(something()).to.be.rejectedWith('argh');
});
ããã«ã¡ã¯ã¿ããªãããã¯asyncawaitã§ããŸãæ©èœããŸãïŒ 'doneïŒïŒ'ãçç¥ããŠãã ããïŒ
describe('New order from landing', function() {
describe('check new client function', function () {
it("must check db and return that random client is new", async function () {
var result = await handler.checkClient(reqNewClient.body)
expect(result).to.have.property('newclient').equal(true)
})
})
})
çµæïŒ
çéžããã®æ°èŠæ³šæ
æ°ããã¯ã©ã€ã¢ã³ãæ©èœã確èªããŠãã ãã
âdbããã§ãã¯ããã©ã³ãã ã¯ã©ã€ã¢ã³ããæ°ããããšãè¿ãå¿ èŠããããŸã
1ãã¹ïŒ9ããªç§ïŒ
@kolykhalovããããšãããã¯ç§ã®ããã«åãã
ç§ã®å Žåãéåæãããã¯ãtry / catchã§ã©ããããŸãã
it('It should activate a user.', async() => {
return new Promise((resolve, reject) => {
try {
// Get the last activation token from the DB
let sql = 'select * from activation_tokens order by created_at desc limit 1';
let res = await DB.query(sql);
let {token} = res[0];
server
.post('/auth/activate')
.send({token})
.set('Content-Type', 'application/x-www-form-urlencoded')
.expect('Content-Type', /json/)
.expect(200)
.end((err, res) => {
res.body.data.should.contain.keys('message');
res.body.data.message.should.equal("Activated");
resolve();
});
} catch (e) {
console.error(e);
}
});
});
è匱æ§ãåé¿ããããã«ã¢ããã°ã¬ãŒããããŸããã ä»ãç§ã¯99ã®ãã¹ããæžãçŽããªããã°ãªããŸããã FML
ãããã£ãŠãåé¡ãäœã§ããããæ確ã«ããããã«ã done
ãšasync
ã䜿çšããå¿
èŠã¯ãªããšèšã人ãããŸãããããã§ã¯äž¡æ¹ã䜿çšããäŸã瀺ããŸãã
it('should error on fn', async function(done) {
try {
await fn();
} catch (e) {
// assert some things here
done()
}
});
done
ã䜿çšããªããšããšã©ãŒãã¹ããŒãããªãå Žåã«ãã¹ãã«åæ ŒããŸãã expect(await fn).to.throw('blah')
ãããªãã®ã䜿çšããããšãææ¡ãã人ãããŸãããã¯ã³ã©ã€ããŒã«åãŸããããå€ãã®ããããã£ããã§ãã¯ããå¿
èŠãããå ŽåããããŸãã
ãã®ãšã©ãŒãçºçããŸãããã誀ã£ãŠçŽæãè¿ããŠããŸããïŒã¹ãŒããŒãã¹ãïŒ
it('Should do something', (done) => {
return supertest(server)
.get(`/api/endpoint`)
.set('somekey', 'somevalue')
.expect(200)
.then(() => { done(); })
.catch(done);
});
'return'å¥ãåé€ãããšãåé¡ã解決ããŸãã
ããã«å€¢äžã«ãªã£ãä»ã®äººã®ããã«...
ããã¯æ©èœããŸãïŒ
it("should work", async () => {
await something;
});
ããã¯ããŸããïŒ
it("should work", async (done) => {
await something;
});
ãã©ã¡ãŒã¿ãšããŠdone
ãåé€ããå¿
èŠããããŸãã
@tamoyal ãããæçš¿ããããã«ã
async / awaitã䜿çšãããšãæé»ã®Promise
ãè¿ãããŸãã done
ã³ãŒã«ããã¯ã®äœ¿çšã¯
ããã«ç€ºãããã«ã CPSããŒã¹ã®éåæã ã¢ã«ã¯äž¡æ¹ããµããŒãããŠããŸã...ãããåæã«ã§ã¯ãããŸããã
ããã¯ææžåãããŠãããMocha-3.0ãªãªãŒã¹ä»¥éã®æšæºçãªåäœã§ãã
ãã®ãšã©ãŒãçºçããŸãããã誀ã£ãŠçŽæãè¿ããŠããŸããïŒã¹ãŒããŒãã¹ãïŒ
it('should do something', (done) => { return supertest(server) .get(`/api/endpoint`) .set('somekey', 'somevalue') .expect(200) .then(() => { done(); }) .catch(done); });
'return'å¥ãåé€ãããšãåé¡ã解決ããŸãã
@victorsferreira ãããã解決çã ã£ãã¯ãã§ã...
it('should do something', () => {
return supertest(server)
.get(`/api/endpoint`)
.set('somekey', 'somevalue')
.expect(200);
});
@tamoyalããããããç§ãã€ãŸãããããã®ã ã£ãã ç§ãäœæããé¢æ°ã®ãã©ã¡ãŒã¿ãŒã調ã¹ãããã䜿çšããŠæ±ºå®ãäžãããã«ããµãŒãããŒãã£ã®ã©ã€ãã©ãªã䜿çšããããšã¯éåžžã«çŽæçã§ã¯ãããŸããã
@mienaikoe ããã®æ£ç¢ºãªã·ããªãªã¯æ瀺çã«ææžåãããŠããŸããããªãã¯ç¥ã£ãŠããŸã...
@plroebuck 2ã€ã®ããšïŒ
1ïŒäœããææžåããããšãšãé¢æ°ã®ãã©ã¡ãŒã¿ãŒãã€ã³ããã¹ãã¯ãããnpmã®æ°å°ãªãã©ã€ãã©ãªãŒã®1ã€ã§ããããšã«ã¯éãããããŸãã ç§ãæåã«åéã«äŒã£ããšãã«ãã¹ãŠã®åéã®èº«å 調æ»ãè¡ã£ãããšãèšé²ããããšã¯ã§ããŸããããããã§ãå¥åŠã§ãçç±ããªããæ瀺çã«çç±ãäŒããªãéãã人ã ã¯ããã«ã€ããŠäžå¹³ãèšãã§ãããã
2ïŒããã¥ã¡ã³ãã«æ¬ é¥ããããŸãïŒ
Mocha v3.0.0以éã§ã¯ãPromiseãè¿ããdoneïŒïŒãåŒã³åºããŸã...
ããã¯ãdoneãåŒã³åºãããšã§ã¯ãªãã䜿çšãããã©ããã«é¢ä¿ãªãã_ãã©ã¡ãŒã¿ãŒãšããŠdone
ãæå®ããããšã§ãã
@mienaikoe
it
ã®2çªç®ã®ãã©ã¡ãŒã¿ãŒããã§ãã¯ããŠãé¢æ°ãååšãããã©ããã確èªããååšããå Žåã¯ããã®ã¢ãªãã£ããã§ãã¯ããŠããŠãŒã¶ãŒãã³ãŒã«ããã¯ãè¿œå ãããã©ãããå€æããŸãã ããã¯ã€ã³ããã¹ãã¯ã·ã§ã³ãšããŠã¯ã»ãšãã©é©æ Œã§ã¯ãªããJavaScriptã§äžè¬çã«äœ¿çšãããŸãããã©ã¡ãŒã¿ãšããŠè¡ãããåé€ã¯ç§ã®ããã«åããïŒ
åïŒ
AFTERïŒåäœããŸãïŒïŒ
@QauseenMZ ããåããšãåŸãã®ã³ãŒãã«éãã¯ãããŸããã
ããªãã¯ãŸãããªãã®çŽæãè¿ããŠããŸããã ãããªæããããªãã§ããïŒ
it('should receive successful RPC response', async () => {
return await getResponse(unitData)
.then((res) => {
expect(res).to.have.status(200);
});
});
PSã Nodeã³ãŒã«ããã¯åŒæ°ã®é åºã厩ããŠããŸã... error
_ always_ãæåã«ãªããŸãã
@plroebuckèšåããŠãããŠããããšãïŒ ç·šéããŸããã
getResponseé¢æ°ãã³ãŒã«ããã¯ãè¿ããŠãããããpromiseãåŠçããŠããŸããã ããã¯ç§ããããæ©èœãããå¯äžã®æ¹æ³ã§ããã getResponseé¢æ°ã¯æ¬¡ã®ãšããã§ãã
ããã§ããšã©ãŒã¯ãã³ãŒã«ããã¯getResponseé¢æ°ãè¿ãããŠãããšããçç±ã ãã§2çªç®ã®ãã©ã¡ãŒã¿ãŒã§ãã ããã«ã€ããŠã®ããªãã®èããæããŠãã ããã ããããšãïŒ
ããã€ãã®éšåã¯ã¡ãã£ãšéè«ççã«èŠããŸãã ããããããããããã«ãã©ã®request
ããã±ãŒãžã䜿çšããŠããŸããïŒ
options
ãªããžã§ã¯ãïŒ unitData
ãšããååïŒãè¿ãå¿
èŠãããã®ã¯ãªãã§ããïŒ
obj
ã©ãããæ¥ãã®ã§ããïŒres.statusCode === 200
res.body.error
ãããã®ã¯ãªãã§ããïŒPSã ã³ãŒãã®ç»åã§ã¯ãªããã³ãŒãèªäœã貌ãä»ããŠãã ãã...
ããã«å€¢äžã«ãªã£ãä»ã®äººã®ããã«...
ããã¯æ©èœããŸãïŒ
it("should work", async () => { await something; });
ããã¯ããŸããïŒ
it("should work", async (done) => { await something; });
ãã©ã¡ãŒã¿ãšããŠ
done
ãåé€ããå¿ èŠããããŸãã
@tamoyalããªãã¯ç§ã®åœãæã£ã<3
ãããå£ããŠãåããšã©ãŒãçºçããŸãã
it('Location Querying Works', async () => {
await WeatherComponent.pullLocationData();
Vue.nextTick(()=>{
expect(WeatherComponent.$el.textContent).contain("Spain")
})
})
ãããªãã«ãã®åé¡ãžã®è¿
éãªè§£æ±ºãäžããçŽæã§ããªãã®å
šäœã®ãã¹ããã©ãããã䜿çšããã«ã¯ã resolve
ããªãã¯åãããã«done
ã
ãããåããŸãïŒ
it.only("Works with the database", async (done) => {
let browser = await puppeteer.launch();
let query = db.collection('lists').where('ownerId', '==', 'UJIXXwynaCj8oeuWfYa8');
let ct = 0;
query.onSnapshot(async querySnapshot => {
if (ct === 0) {
await addAPurpose(browser, session, sessionSig); // A function with a bunch of Puppeteer code.
ct++
} else {
expect(querySnapshot.size).to.equal(1);
expect(querySnapshot.docs[0].get().title).to.equal("Understand Mocha");
done();
}
console.log(`Received query snapshot of size ${querySnapshot.size}`);
}, err => {
console.log(`Encountered error: ${err}`);
});
});
ããã«ïŒ
it.only("Works with the database", async () => {
const onSnap = new Promise(async (res, rej) => {
let browser = await puppeteer.launch();
let query = db.collection('lists').where('ownerId', '==', 'UJIo1gGMueoubgfWfYa8');
let ct = 0;
let unsubscribe = query.onSnapshot(async querySnapshot => {
if (ct === 0) {
await addAPurpose(browser, session, sessionSig);
ct++
} else {
expect(querySnapshot.size).to.equal(1);
expect(querySnapshot.docs[0].data().title).to.equal("Evolution");
// done();
unsubscribe();
res();
}
console.log(`Received query snapshot of size ${querySnapshot.size}`);
}, err => {
console.log(`Encountered error: ${err}`);
rej()
});
});
return onSnap;
});
ãããŠããã¯ããªããæãããã«æ©èœããŸãã
done
ãåé€ããå¿
èŠãããããšã«é©ããããã¹ãã¯ãå®äºãããŸã§å®è¡ãããããã ã doneãasyncã§äœ¿çšããŠã¯ãªããªãããšãããæ確ã«ããããã«ãdoneãæž¡ãããå Žåãéåæé¢æ°ã¯_ããã«_倱æããå¿
èŠããããŸãã Mochaã¯æ¬¡ã®æ¹æ³ã§ãã¹ããéå§ããå¿
èŠããããŸãã
done
åŒæ°ãæ€åºããŠããŸããäž¡æ¹ãååšããå Žåã¯ã done
ãåŒã³åºããããŸã§ãã¹ããå®è¡ããŠããããã«ãŒããŒã«ãå®è¡ããã®ã§ã¯ãªããã¹ããŒããå¿
èŠããããŸãã 次ã«ããšã©ãŒã¯ãã³ãŒããå¥ã®promiseã§ã©ãããã done
ãšåãããã«resolveã䜿çšããããšã瀺åããŠããã¯ãã§ãã
function.prototype.name === "AsyncFunction"
䜿çšã§ããããšã¯ç¥ã£ãŠããŸãã ããããããã¯
if (function.prototype.name === "AsyncFunction && arg1.name === "done") {
throw new Error("Can't use done with an async function")
}
ãããå®è£ ããŸãã
ç§ã¯ããã«é¢ããŠã»ãŒSOLã§ããã éåæã³ãŒããå®è¡ããå¿
èŠããããã³ãŒãã®å®è¡ãïŒãããŸã§ã«ïŒçµäºããªãããšãäºæ³ããããããdoneã䜿çšããå¿
èŠããããŸãã åä»ãªããã¯ã¢ã©ãŠã³ãã¯ãéåæãã¹ãã³ãŒããèªå·±åŒã³åºãéåæé¢æ°ã§ã©ãããã it
é¢æ°ãåæé¢æ°ãšããŠæ®ãããš
解決ïŒ
it("It shouldn't be like this", function (done) {
( async function(){
var life = require('InfiniteLife');
var asyncRes = await life.someCoolstuff();
assert(asyncRes);
setTimeout( function(){
done();
},letsCallItQuitsNow);
})();
});
ãã¬ãŒã¯ãå®äºããéåæé¢æ°ã®äŸã
it('If the credentials exists in the system it should return the token generated against it.', async (done) => {
let aObj = await admin.createAdmin();
chai.request(server)
.post("/authenticate")
.set("Content-Type", "application/x-www-form-urlencoded")
.send({username: aObj.login,password:aObj.password})
.end((err, res) => {
res.should.have.status(200);
res.body.should.be.a("string");
done();
});
});
æåäºäŸ
it('If the credentials exists in the system it should return the token generated against it.', async () => {
let adminObj = await admin.createAdmin();
chai.request(server)
.post("/auth/login")
.set("Content-Type", "application/x-www-form-urlencoded")
.send({username: adminObj.login,password:adminObj.password})
.end((err, res) => {
res.should.have.status(200);
res.body.should.be.a("string");
// done();
});
});
@ Haisum92
ãã¹ãã§ã¯done
ãasync
ãå¿
èŠãããŸããã ãã£ã€httpã¯çŽæãè¿ããŸãã Promiseãè¿ããšãMochaã®ãã¹ãã¯éåæã³ãŒãã§æ©èœããŸãã
it('If the credentials exists in the system it should return the token generated against it.', () => {
let adminObj = await admin.createAdmin();
return chai.request(server)
.post("/auth/login")
.set("Content-Type", "application/x-www-form-urlencoded")
.send({username: adminObj.login,password:adminObj.password})
.end((err, res) => {
res.should.have.status(200);
res.body.should.be.a("string");
});
});
@NateZimmer
æçš¿ããã解決çã¯ãæéãããããããå Žåã«ãã¹ããã¿ã€ã ã¢ãŠãããããšã§ãã ã¢ã«ã«ã¯ãã§ã«ãã®æ©èœãçµã¿èŸŒãŸããŠããŸãã
it("It should be liek this", async function () {
this.timeout(letsCallItQuitsNow);
var life = require('InfiniteLife');
var asyncRes = await life.someCoolstuff();
assert(asyncRes);
});
ããªãã®äŸããã¿ã€ã ã¢ãŠããè¶ ããŠããã¹ãã«å€±æããªãããã§ãã®ã§ããã®æ£ç¢ºãã«å¿ããŠæ³šæããŠãã ãã
`express / jsãšfirebaseã¯ã©ãŠãé¢æ°ã䜿çšããŠãAPIãšã©ãŒå¿çã確èªããããŒã¯ã³ãååŸããŠåè©Šè¡ããŸãã expressã䜿çšããå Žåã¯ã.sendã§ã¯ãªã.jsonãè¿ãããã«ããŠãã ããããŸããmochaã§ãã¬ãŒã®ãã°ãæ©èœããããããã¬ãŒã³ãªconsole.logã䜿çšããŠãã ããã
å¿
ãasyncã䜿çšããå®å
šã«å®è¡ããŠãã ããã
process.env.NODE_ENV='TESTING';
const { FIREBASE_UID } = require('dotenv').config()?.parsed;
const { red, green, white } = require('chalk');
const chai = require('chai');
const chaiHttp = require('chai-http');
const server = require('../lib/api').API;
const should = chai.should();
const expect = chai.expect;
chai.use(chaiHttp);
const test = chai.request(server).keepOpen();
const shouldPrint = (details, status) => {
return white(`details: ${details}, status: ${status}`);
};
describe('Authorization Middleware Error Check for bad token', () => {
it(shouldPrint('Bad Request', red(400)), async () => {
try {
const res = await test.get('/').send()
res.should.have.status(400);
res.should.have.json
const { details, status } = JSON.parse(res.text)
expect(details).to.equal('Bad request')
expect(status).to.equal(400)
} catch (error) {
throw error
}
})
it(shouldPrint('Unauthorized', red(401)), async () => {
try {
const res = await test.get('/').set('Authorization', 'Bearer bad123token').send()
res.should.exist
res.should.have.status(401);
res.should.have.json
const { details, status } = JSON.parse(res.text)
expect(details).to.equal('Unauthorized')
expect(status).to.equal(401)
} catch (error) {
throw error
}
})
}ïŒ
describe('Get token and ping', () => {
let adminToken
it(shouldPrint( 'Create custom jwt for testing', green(200)), async () => {
try {
const res = await test.get(`/createToken/${FIREBASE_UID}`).send()
res.should.exist
res.should.have.status(200);
res.should.have.json
adminToken = (JSON.parse(res.text)).token
} catch (error) {
throw error
}
})
it(shouldPrint('PING', green(200)), async () => {
try {
const res = await test.get('/')
.set('x-tenorders-testing', 'true')
.set('Authorization', `Bearer ${adminToken}`).send()
res.should.exist
res.should.have.status(200);
res.should.have.json
const { details, status } = JSON.parse(res.text)
expect(details).to.equal('PING')
expect(status).to.equal(200)
} catch (error) {
throw error
}
})
}ïŒ
`
æãåèã«ãªãã³ã¡ã³ã
async
é¢æ°ïŒããã«ïŒãšdone
ãç ŽããŸãã