ãã®ãã¹ãïŒ
it('returns the correct value', function(done) {
var returnValue = 5;
aPromise.then(function() {
expect(returnValue).to.equal(42);
done();
});
});
ãã®ãã¹ãã¯ãã¢ãµãŒã·ã§ã³ãšã©ãŒã§ã¯ãªãtimeout of 2000ms exceeded
倱æããŸãã ããã¯ã expect()
åŒã³åºãããšã©ãŒãã¹ããŒãã done()
ãå®è¡ãããªãããã ãšæããŸãããã®çš®ã®ã³ãŒãããã¹ãããããã®ãããè¯ãæ¹æ³ããããã©ããçåã«æã£ãŠããŸãã
aPromise
解決ããŸããïŒ ããã§ãªãå Žåã¯ãã¿ã€ã ã¢ãŠããã¹ããŒãã以å€ã«éžæè¢ã¯ãããŸããã
@NickHeinerã¯ãã解決ããŸãã 次ã«ã expect()
ã¯ã returnValue
ãequal(42)
ã§ã¯ãªãããšãæ€åºããã¹ããŒããŸãã
@gurdigaã¢ãµãŒã·ã§ã³ãšã©ãŒã§ã¯ãªãã¿ã€ã ã¢ãŠããçºçããå Žåã«ã¹ããŒãããããšãã©ã®ããã«ç¥ã£ãŠããŸããïŒ
@gurdigaããªãã®çŽæã«ã¯ç¬èªã®ãšã©ãŒãã£ãããããããã«ç§ã«ã¯æããŸãã çŽæã«.catch(done)
ãè¿œå ããŠã¿ãŠãã ãããããããã°ãæå³ãããšããã«æ©èœãããšæããŸãã
@hallasãããŒïŒ_ãã_ãçãã§ããïŒ :) aPromise.finally()
ã¯ã done
ãå
¥ããã®ã«æé©ãªããã§ãïŒpromiseã解決ããããšãã«åŒã³åºãå¿
èŠããããŸãã ;ïŒ
ããããšãããããŸããïŒ
ç§ã¯æãã ãšæããŸãã
ç§ã¯ã€ãã«ãããæã«å
¥ãããšæããŸãïŒ .then()
ã .catch()
ãŸãã¯.finally()
ã«æž¡ããããã®ã§ãããã©ããã«ããããããpromiseã®ãã³ãã©ãŒé¢æ°ã®ããããã§äœããã¹ããŒããããšããšã©ãŒã¯promiseã©ã€ãã©ãªã«ãã£ãŠåŠçãããŸãã ãã®ããã«ããã¹ãã©ã³ããŒã¯å®éã®ãšã©ãŒãèŠãããšã¯ãªãã done()
ãåŒã³åºãããããšããããŸããïŒã¢ãµãŒã·ã§ã³ãšã©ãŒãã¹ããŒããåã«äœããçºçããããïŒããããã£ãŠãã¿ã€ã ã¢ãŠããšã©ãŒã¯ãã¹ãã©ã³ããŒããåŸããããã¹ãŠã§ãã
çŽæããæãåºãããã«ãç§ã¯setTimeout()
ã䜿çšããŸãïŒ
it('returns the correct value', function(done) {
var returnValue = 5;
aPromise.then(function() {
setTimeout(function() {
expect(returnValue).to.equal(42);
done();
});
});
});
ãããé©åãªãšã©ãŒã¡ãã»ãŒãžãååŸããŠã©ã³ããŒã®åäœããã¹ãããå¯äžã®æ¹æ³ã§ããããšãããããŸããã
done
ã.catch()
ãŸãã¯.finally()
ã«æž¡ããããšãã©ã®ãããªå Žåã§ããã¹ãã«åæ ŒãããšèŠãªããããããã¢ãµãŒã·ã§ã³ãšã©ãŒãçºçããå Žåããããã¯è¡šç€ºãããŸããã
ç§ã¯åæ§ã®åé¡ã«ééããæçµçã«ãpromiseã䜿çšããŠéåæé¢æ°ããã¹ããããšãã«doneã䜿çšããã¹ãã§ã¯ãªããpromiseãè¿ãã ãã§ããããšã«æ°ä»ããŸããã ãããã£ãŠãã¿ã€ã ã¢ãŠããªãã§ãããå®è¡ã§ããã¯ãã§ããäŸïŒ
it('returns the correct value', function() {
var returnValue = 5;
return aPromise.then(function() {
expect(returnValue).to.equal(42);
});
});
ãã®åé¡ã¯ãŸã ååšããŠãããšæããŸãã ã¢ãžã¥ãŒã«ãpromiseã䜿çšããŠããªããããpromiseãè¿ãããšã§è§£æ±ºã§ããªãã¿ã€ã ã¢ãŠãã®åé¡ãçºçããŸãã
it("works", function(done) {
new Something()
.on("eventA", function(result) {
expect(result).to.be.true;
})
.on("eventB", function(result) {
expect(result).to.be.false;
done();
});
});
Promise
ã§ã©ããããã®ã¯éå°ãªããã§ããtry
/ catch
ã©ããããããšãéå°ã«æããããã«éèŠãªããšã«ãçµæã¯Error: done() called multiple times
ãŸããã¢ã€ãã¢ïŒ
http://staxmanade.com/2015/11/testing-asyncronous-code-with-mochajs-and-es7-async-await/
ããã°æçš¿ã®æšå¥šäºé
ã«é¢ããŠã¯ãéåæé¢æ°ã®ãšã©ãŒåŠçã«ã€ããŠã¯ããããŸããããåçŽãªpromiseã®å Žåãtry-catchã®æšå¥šäºé
ã¯å¥åŠã§ããtry-catchã䜿çšããªãå
ã®promiseã®è©Šè¡ã¯ã»ãŒæ£ããã .catch(done)
ã䜿çšããã ãã§æžã¿ãŸããã then
ã®2çªç®ã®ãã©ã¡ãŒã¿ãŒã.catch(done)
done
ã ïŒç¢ºãã«ãMochaã¯promiseãçŽæ¥ãµããŒãããŠããã®ã§ãpromiseãè¿ãããšãã§ããŸããããã®äŸ¡å€ã¯ãããŸã...ïŒæåã®promiseã®äŸã®åé¡ã¯ãtry-catchããªãããšã§ã¯ãªãã2çªç®ã®ãã³ãã©ãŒã§ããã to then
ã¯ãæåã®ãã³ãã©ãŒã«ãã£ãŠã¹ããŒãããäŸå€ãé€ããŠåŒã³åºãããŸãããã次ã®catch
ã¯åŒã³åºãããŸãã çŽæããã®ããã«èšèšãããçç±ãäœã§ãã£ããã¯ããããŸããããããã¯çŽæãã©ã®ããã§ãããã§ãã ããã«ãäœããã®çç±ã§è€æ°ã®then
ããã£ãå Žåãå¿
èŠãªã®ã¯1ã€ã®æåŸã®.catch(done)
ã ãã§ããããã¯ããã³ãã©ãŒå
ã®try-catchãããåªããŠããç¹ã§ãïŒ .catch(done)
ã¯ãããããå®åçã§ã¯ãªããšããäºå®ïŒã
APIã«ã€ããŠïŒ
.on("error", function(error) {...})
ïŒããããããªãã¹ã³ããŠæã£ãŠããªãéããMochaã«å°éããããšã¯ãããŸããããªã¹ããŒã¯ãšã©ãŒã§done
ãåŒã³åºããŸãïŒãŸãã¯ããªã¹ããŒã«ãšã©ãŒãæåã®ãã©ã¡ãŒã¿ãŒãšããŠæž¡ãããå Žåã¯ããªã¹ããŒã§done
ã䜿çšããŸãïŒäŸïŒ .on("error", done)
ã promiseã®.catch(done)
ããã«ãã€ãã³ããã³ãã©ãŒããšã«1åã§ã¯ãªãããã¹ãããšã«1åèšè¿°ããå¿
èŠããããŸãã"end"
/ "drain"
ã€ãã³ãã䜿çšããŠãä»ã®ã€ãã³ãã®ããŒã«å€ãèšå®ãããŠãããã©ããã確èªããŸããç³ãèš³ãããŸããããAPIãã©ã®ããã«ãšã©ãŒãå ±åããã®ããŸã ããããŸããã
ããããããŸã§ã®ãšãããäœãã倱æãããšãã®ã¿ã€ã ã¢ãŠãã«äŸåããŠããŠãæåã§æãäžããŠ_how / why_ãèŠã€ããŠããŸããã 幞ããªããšã«ãç©äºãå£ããããšã¯ãã£ãã«ãããŸããããããã¯ããè¯ããã¶ã€ã³ã®æ¬ åŠã®èšãèš³ã«ã¯ãªããŸããïŒç§ã®åŽã§ã¯ãã»ãšãã©ïŒã
@stevenvachon ïŒäºåã«èš±ããŠãã ãããããããããªãã®äŸã«ããã«åé¡ãçºçããããšã¯ãããŸããã ã€ãã³ããªã¹ããŒã§è¡ãããã¢ãµãŒã·ã§ã³ã¯ã uncaughtException
ãããã³ã°ãä»ããŠMochaã«ãã£ãŠåŠçãããå¿
èŠããããŸãïŒã€ãã³ããšããã¿ãŒã®å®è£
ããªã¹ããŒãšã©ãŒããã£ãããã error
ã€ãã³ããªã©ãçºè¡ããŠããå Žåãé€ããŸããããã§ããç°¡åã«å®è¡ã§ããŸãã解決ïŒã
ããã§ãå
éšã§ã®å®è£
ãPromisesã䜿çšããŠããããPromiseãå
¬éããã®ã§ã¯ãªãã€ãã³ããçºè¡ããå Žåãã¢ãµãŒã·ã§ã³ã¯å®éã«ãé£ã¹ããããããšã«ãªããŸãã ãã®åé¡ãåé¿ããæ¹æ³ã¯ã unhandledRejection
ã䜿çšããããšã§ãã
ç§ã¯éåžžãããããã¹ãã®åã«å®è¡ãããã»ããã¢ããã¹ã¯ãªããã«å ¥ããŸãã
process.on('unhandledRejection', function (reason)
{
throw reason;
});
泚ïŒãã©ãŠã¶ã§æ©èœãããã«ã¯ãè¿œå ã®ãšã«ããŒã°ãªãŒã¹ãå¿ èŠã«ãªãå ŽåããããŸãã
ããã¯äžè¬çãªãŠãŒã¹ã±ãŒã¹ã§ãããããMochaãuncaughtException
ãšåãããã«ããããµããŒãããããšãæåŸ
ããŠããŸãã Promisesã䜿çšããŠãããããšãã£ãŠããããçºä¿¡è
ã«è¿ããããšããæå³ã§ã¯ãããŸããã
[email protected]ã§ãåãåé¡ããã
it('Convert files into base64', (resolve) => {
let files = Promise.all(promises);
return files
.then(([actual, expected]) => {
assert.equal(actual, expected, 'Files not are equal');
resolve();
})
.catch(error => resolve);
});
Error: timeout of 2000ms exceeded. Ensure the done() callback is being called in this test.
.catch
ãééã£ãŠããŸãã error => resolve
ã¯function(error) { return resolve }
error => resolve
ãšåçã§ããã€ãŸãã resolve
ã¯åŒã³åºãããããšã©ãŒã¯ç¡èŠãããŸãã å¿
èŠãªã®ã¯ããšã©ãŒä»ãã§resolve
ãåŒã³åºãããšã§ããããã¯ã error => resolve(error)
ãŸãã ãã¡ããã X
ãåŒã³åºãããã®ãšåãåŒæ°ã§é¢æ°Y
ãåŒã³åºãã ãã®ã³ãŒã«ããã¯é¢æ°X
ãæž¡ãããšã¯ã Y
ãåã«æž¡ãããšãšåãã§ããã³ãŒã«ããã¯ãªã®ã§ã .catch(error => resolve(error))
ã§ã.catch(resolve)
ç°¡ç¥åã§ããŸãã ïŒ then
æž¡ãå Žåã¯ã resolve
çŽæ¥æž¡ãå¿
èŠããªãããã then
ã®çµæãã©ã¡ãŒã¿ãŒãresolve
æž¡ããªãããã«ããå¿
èŠããããŸãããšã©ãŒãšããŠæ±ãããªãããã«ããããã®then(()=>resolve())
ã§ã¯ãªã.then(resolve)
;ãã ããã¢ãµãŒã·ã§ã³ã«then
ã³ãŒã«ããã¯ã䜿çšããŠãããããããã¯çºçããŸããã ãïŒ
ïŒãŸããæ
£äŸçã«ãããã§ã®resolve
ã¯ãæåãšå€±æã®äž¡æ¹ãåŠçããåŒæ°ã§åŒã³åºããããã©ããã«åºã¥ããŠã©ã¡ããåŒã³åºãããããå€æãããããããããdone
ã«æ²¿ã£ãååãä»ããå¿
èŠããããŸãããããã£ãŠãã¢ã«ã®ãšã©ãŒã¡ãã»ãŒãžã«ããååã§ãããããã¯è«ç¹ãããããŸãããèªã¿é²ããŠãã ãããïŒ
ãã ãããã®å ŽåãMochaã¯ãã¹ãã®æåãŸãã¯å€±æã瀺ããã®ãšããŠpromiseãæåãŸãã¯å€±æããã®ãåŸ ã€ãããpromiseãè¿ãã ãã§ãtest doneãã©ã¡ãŒã¿ãŒããŸã£ãã䜿çšããªãããšã§ãããã«åçŽåã§ããŸãïŒdoneãã©ã¡ãŒã¿ãŒããªãå ŽåïŒãã¹ãé¢æ°;äž¡æ¹ã䜿çšãããå Žåã®åäœã¯ãŸã ããã·ã¥åãããŠããŸãïŒïŒ
it('Convert files into base64', () => {
let files = Promise.all(promises);
return files
.then(([actual, expected]) => {
assert.equal(actual, expected, 'Files not are equal');
})
});
@lsphillipsã¯ç§ã®ããã«åããŸãã ããããšãïŒïŒ mochaãããã©ã«ãã§ããããµããŒãããããšãæåŸ ããŠããŸãã ïŒ2640ãäœæããŸããã
ããã解決ããã®ã«å°ãæéãããããŸããïŒ äžèšã®åçã«åºã¥ããŠããããã¯2ã€ã®ãªãã·ã§ã³ã§ãã
npm install --save mocha expect.js q
./node_modules/mocha/bin/mocha test.spec.js
// test.spec.js
var $q = require('q');
var expect = require('expect.js');
describe('tests with done', function(){
it('returns the correct value from promise', function(done) {
var returnValue = 5;
var def = $q.defer();
def.promise.then((val) => {
expect(val).to.equal(42);
done();
}).catch(done);
def.resolve(returnValue)
});
})
describe('tests returning promises', function(){
it('returns the correct value from promise', function() {
var returnValue = 5;
var def = $q.defer();
def.resolve(returnValue)
return def.promise.then((val) => {
expect(val).to.equal(42);
});
});
})
tests with done
1) returns the correct value from promise
tests returning promises
2) returns the correct value from promise
0 passing (15ms)
2 failing
1) tests with done returns the correct value from promise:
Error: expected 5 to equal 42
at Assertion.assert (node_modules/expect.js/index.js:96:13)
at Assertion.be.Assertion.equal (node_modules/expect.js/index.js:216:10)
at def.promise.then (tests/test.spec.js:9:24)
at _fulfilled (node_modules/q/q.js:854:54)
at self.promiseDispatch.done (node_modules/q/q.js:883:30)
at Promise.promise.promiseDispatch (node_modules/q/q.js:816:13)
at node_modules/q/q.js:570:49
at runSingle (node_modules/q/q.js:137:13)
at flush (node_modules/q/q.js:125:13)
at _combinedTickCallback (internal/process/next_tick.js:67:7)
at process._tickCallback (internal/process/next_tick.js:98:9)
2) tests returning promises returns the correct value from promise:
Error: expected 5 to equal 42
at Assertion.assert (node_modules/expect.js/index.js:96:13)
at Assertion.be.Assertion.equal (node_modules/expect.js/index.js:216:10)
at def.promise.then (tests/test.spec.js:22:24)
at _fulfilled (node_modules/q/q.js:854:54)
at self.promiseDispatch.done (node_modules/q/q.js:883:30)
at Promise.promise.promiseDispatch (node_modules/q/q.js:816:13)
at node_modules/q/q.js:570:49
at runSingle (node_modules/q/q.js:137:13)
at flush (node_modules/q/q.js:125:13)
at _combinedTickCallback (internal/process/next_tick.js:67:7)
at process._tickCallback (internal/process/next_tick.js:98:9)
@gurdiga setTimeoutïŒïŒã®ã¢ã€ãã¢ãããããšãïŒ åæ§ã®åé¡ãçºçããŸããããå°ãªããšãé©åãªãšã©ãŒã¡ãã»ãŒãžã衚瀺ãããããã«ãªããŸããã
ç§ã®ã·ããªãªã§ã¯ãNightmareã䜿çšããŠãã¹ããçµäºããŸããã ç§ã«ãšã£ãŠã®è§£æ±ºçã¯ã .catch(done)
䜿çšããããšdone(error)
ãåŒã³åºãããšãã§ããŸãã
describe('Clicking in any bad reputation tag', () => {
it('open the bad reputation modal', (done) => {
nightmare
.select('#per-page', '50')
.waitForAjax()
.click('[data-reputation="bad"]')
.evaluate(function() {
return document.querySelector('.vue-modal .ls-modal-title').innerText
})
.then(function(title) {
title.should.equal('Sua segmentação teve uma avaliação ruim!')
done()
})
.catch((error) => {
screenshot(nightmare)
done(error)
})
})
})
@itumoraesã¯æ©èœããŸããã代ããã«ãããè¡ãããšãã§ããŸãïŒ
describe('Clicking in any bad reputation tag', () => {
it('open the bad reputation modal', () => {
return nightmare
.select('#per-page', '50')
.waitForAjax()
.click('[data-reputation="bad"]')
.evaluate(function() {
return document.querySelector('.vue-modal .ls-modal-title').innerText
})
.then(function(title) {
title.should.equal('Sua segmentação teve uma avaliação ruim!')
})
})
})
çŽæãè¿ãå Žåã¯ã done()
ãåŒã³åºãå¿
èŠã¯ãããŸããã MochaãExpressãMongooseã§ã®Async / Awaitã®äœ¿çšã«é¢ããããã°æçš¿
以äžã®ã¹ã¯ãªããã䜿çšããŸããããåãã¿ã€ã ã¢ãŠãè¶ éãšã©ãŒãçºçããŸããã
MyscriptïŒ
describeïŒ "getBillingDetail"ãasync functionïŒïŒ{
this.timeoutïŒ55000ïŒ;
it.onlyïŒ "æå®ãããæå¹ãªãžã§ãåã確èªããŠãã ãã"ãasyncé¢æ°ïŒå®äºïŒ{
this.timeoutïŒ55000ïŒ;
var result = await url.getBillingDetailïŒ '12254785565647858'ïŒ;
console.logïŒresultïŒ;
assert.equalïŒresultãtrueïŒ;
}ïŒ;
}ïŒ;
ãšã©ãŒïŒ55000msã®ã¿ã€ã ã¢ãŠããè¶ ããŸããã éåæãã¹ããšããã¯ã®å Žåã¯ããdoneïŒïŒããåŒã³åºãããŠããããšã確èªããŠãã ããã Promiseãè¿ãå Žåã¯ãããã解決ãããããšã確èªããŠãã ããã
è€æ°ã®ã¯ããŒãºãããåé¡ã§åãããšã綎ãã®ããããŸãã å®äºããã³ãŒã«ããã¯ãéåæé¢æ°ã«æž¡ããªãã§ãã ããã éåæãã¹ãã«é¢ããããã¥ã¡ã³ããèªã
@Munterå®äºããã³ãŒã«ããã¯ãåé€ããŸãããããããã®ãšã©ãŒãåã³çºçããŸã
ããªãã®çŽæã¯æ±ºããŠè§£æ±ºãããªãã£ãããã§ãã
æãåèã«ãªãã³ã¡ã³ã
ç§ã¯åæ§ã®åé¡ã«ééããæçµçã«ãpromiseã䜿çšããŠéåæé¢æ°ããã¹ããããšãã«doneã䜿çšããã¹ãã§ã¯ãªããpromiseãè¿ãã ãã§ããããšã«æ°ä»ããŸããã ãããã£ãŠãã¿ã€ã ã¢ãŠããªãã§ãããå®è¡ã§ããã¯ãã§ããäŸïŒ