次ã®ãã¹ãã§ã¯ã解決ãããPromiseã®ã³ãŒã«ããã¯ããã¹ãå
ã§åŒã³åºãããããšãæåŸ
ããŠããŸããã ã©ãããããã€ãã£ãpromiseã¯ã³ãŒã«ããã¯ãåæçã«åŒã³åºããªããã setTimeout(callback, 0)
ãšåæ§ã®æ¹æ³ã§åŒã³åºãããããã«ã¹ã±ãžã¥ãŒã«ããŸãã ãã ããå®éã«ã¯setTimeoutã䜿çšããªããããã·ãã³ã®åœã®ã¿ã€ããŒã®å®è£
ã¯ã tick()
ãåŒã³åºããšãã«ã³ãŒã«ããã¯ãããªã¬ãŒããŸããã
describe 'Promise', ->
beforeEach ->
<strong i="8">@clock</strong> = sinon.useFakeTimers()
afterEach ->
@clock.restore()
console.log 'teardown'
it "should invoke callback", ->
p = new Promise (resolve, reject) ->
console.log 'resolving'
resolve(42)
console.log 'resolved'
p.then ->
console.log 'callback'
@clock.tick()
console.log "test finished"
ç§ã¯ãã®åºåãæåŸ ããŠããŸãïŒ
resolved
callback
test finished
teardown
代ããã«ç§ã¯ãããååŸããŸãïŒ
resolved
test finished
teardown
callback
ã³ãŒã«ããã¯ã¯ãã¹ãã®çµäºåŸã«åŒã³åºããããããã³ãŒã«ããã¯å ã§çºçããããšã«åºã¥ãã¢ãµãŒã·ã§ã³ã¯å€±æããŸãã
then()
ãåŒã³åºãåãšåŸã«ãçŽæã解決ããããã©ããã¯é¢ä¿ãããŸããã
ç§ããã®åé¡ã«ééããŸãã
Promiseã®ä»æ§ã§ã¯setTimeout
ã䜿çšããŠããªããããããã解決ã§ãããšã¯æããŸããããçŸåšã®ãžã§ãã®çŽåŸã«æ°ãããžã§ããå®è¡ããããã«ã¹ã±ãžã¥ãŒã«ããŸãã
ãã¹ãããçŽæãè¿ããŠã¿ãŸãããïŒ çŸåšãã»ãšãã©ã®ãã¹ãã©ã€ãã©ãªã¯promiseããµããŒãããŠããã it()
é¢æ°ãpromiseãè¿ãå Žåããã¹ãã©ã³ããŒã¯promiseã解決ãŸãã¯æåŠãããã®ãåŸ
ã£ãŠããããã¹ããå®äºããããšãéç¥ããŸãã
ã¯ãããã¹ãããçŽæãè¿ãããšã¯ããããããŸããããŸãã ããããåœã®ã¿ã€ããŒã䜿çšããå Žåããã¹ãæ©èœããæ»ãåã«ãã¹ãã«åå ã§ãããšæåŸ ããŠããŸãã ããã¯äžçš®ã®èŠç¹ã§ãã
ããã¯ãDateãªããžã§ã¯ãã眮ãæããããã®ãšåãããã«ãPromiseãªããžã§ã¯ãã眮ãæããããšã§å®è¡ã§ãããšç¢ºä¿¡ããŠããŸãã ãããå¯èœã«ããã«ã¯ããã€ãã£ãå®è£ ã«äŸåããããšãã§ããªããããpromiseä»æ§ã®ç«¶åããå®è£ ãå¿ èŠã«ãªãå¯èœæ§ããããŸãã
çãããããã§ææããŠããåé¡ãããããŸãã ç§ãééããç¹å®ã®ç¶æ³ãææãããã£ãã®ã§ãããpromiseã®ä»æ§ãšsinonã®ããã¥ã¡ã³ãã®äž¡æ¹ã«åºã¥ããŠãããã¯ãæ©èœããã¯ããã§ããããã«èŠããŸããã ãã®å Žåãç§ã¯çŽæããã¹ãã«æ»ããŠããŸãããåœã®ã¿ã€ããŒã䜿çšãããšãçŽæã解決ãããªãããã«èŠããŸãã
ãããã®ãã¹ãã¯äž¡æ¹ãšãæ©èœããã¯ãã§ãããæåã®ãã¹ãã¯æåãã2çªç®ã®ãã¹ãã¯å€±æããŸãã mochaã§chai-as-promisedãã©ã°ã€ã³ã§chaiã䜿çšããŠããŸãããã2000msã®ã¿ã€ã ã¢ãŠããè¶ ããŸããããã®ãã¹ãã§doneïŒïŒã³ãŒã«ããã¯ãåŒã³åºãããŠããããšã確èªããŠãã ãããããšãããšã©ãŒã衚瀺ãããŸãã
describe('chai as promised', function() {
it('should resolve a promise', function() {
var promise = new Promise(function( resolve ) {
setTimeout( resolve, 1000 );
});
return expect( promise ).to.have.been.fulfilled;
});
});
describe('sinon.useFakeTimers()', function() {
before(function() {
this.clock = sinon.useFakeTimers();
});
after(function() {
this.clock.restore();
});
it('should resolve a promise after ticking', function() {
var promise = new Promise(function( resolve ) {
setTimeout( resolve, 1000 );
});
this.clock.tick( 1001 );
return expect( promise ).to.have.been.fulfilled;
});
});
ç°¡åãªãã¹ããããžã§ã¯ãããŸãšããŸããïŒ https ïŒ//github.com/JustinLivi/sinon-promises-test
ãã¹ããå®äºããåã«åŸ©å ããããšã¯ãå®è¡å¯èœãªåé¿çã®ããã§ãã
describe('sinon.useFakeTimers()', function() {
before(function() {
this.clock = sinon.useFakeTimers();
});
it('should resolve a promise after ticking', function() {
var promise = new Promise(function( resolve ) {
setTimeout( resolve, 1000 );
});
this.clock.tick( 1001 );
this.clock.restore();
return expect( promise ).to.have.been.fulfilled;
});
});
ç§ãã¡ã䜿çšããŠããåé¿çã¯ããã¹ããå®è¡ãããšãã«ããã€ãã£ãã®promiseå®è£ ãsetTimeoutã«äŸåããåçŽãªãã®ã«çœ®ãæããããšã§ãã
window.Promise = require('promise-polyfill')
Sinon.JSã¯ãuseFakeTimersãåŒã³åºããšãã«åãããšãç°¡åã«è¡ãããšãã§ããŸãã
@JustinLiviã¯ãå®äºããåã«åŸ©å ããŠãããŸããïŒ+1ïŒ
ããã§ã解決çãåé¿çã¯ãããŸããïŒ
ç§ã®ãã¹ãã§ã¯ããèšãããŠããã®ã§ãã¢ããªãå€æŽããŠES6Promisesã®äœ¿çšãåæ¢ããããšã¯ã§ããŸãã:)
ãã€ãã£ããããã¹ã§ã¯ãªãães6-promiseããªãã£ã«ã«åé¡ããããŸãã
@JustinLiviã®clock.restore()
ãœãªã¥ãŒã·ã§ã³ã§åé¡ãä¿®æ£ãããŸãã
ãã®åé¡ãé·ãéããã«æ®ã£ãŠããçç±ã¯ããããŸããããããã¯Sinonã®åé¡ã§ã¯ãããŸããã Promisesã䜿çšãããšãåºæ¬çã«éåæããžãã¯ãå®è¡ãããŸãã ããã§ããããã§ã®ãã¹ãŠã®ãã¹ãã¯åæããžãã¯ã䜿çšããŠããŸãïŒOPãå®éã«èšåããŠããããã«ïŒã ãã®ãããæéãåœé ããŠããŠããé¢æ°ã®çµäºåŸã«Promiseã䜿çšããŠå®è¡ããããšã«ãªããŸããã€ãŸãããã¹ããå°ãå€æŽããå¿ èŠããããŸãã ããã¯éåžžãã»ãšãã©ã®ãã¹ããã¬ãŒã ã¯ãŒã¯ïŒããã¯Mochaããã®ãã®ã§ãïŒã®ããã¥ã¡ã³ãã§ã«ããŒãããŠããŸãããä»åŸã®æ°ãããµã€ãã§ãã¹ãã¬ã·ããåãäžããããã€ãã®èšäºã§ããã«å¯ŸåŠããŸãã
ãããã£ãŠã @ JustinLiviã®äŸãå°ãå€æŽãããšã次ã®ãã¹ããè¡ââãããŸãã
var sinon = require('sinon');
describe('sinon.useFakeTimers()', function() {
before(function() {
this.clock = sinon.useFakeTimers();
});
it('should resolve a promise after ticking', function(done) {
var promise = new Promise(function( resolve ) {
setTimeout( resolve, 10000 );
});
this.clock.tick( 10001 );
promise
.then(done) // call done when the promise completes
.catch(done); // catch any accidental errors
});
});
å®éãMochaã䜿çšããŠããå ŽåãPromiseããã¹ããã¬ãŒã ã¯ãŒã¯ã«çŽæ¥è¿ãã ãã§ãPromisesã䜿çšãããšãã«äžèšãšåãã³ãŒãã®ãã·ã§ãŒãã«ãããããŒãžã§ã³ããããŸãã
it('should resolve a promise after ticking', function() {
var promise = new Promise(function( resolve ) {
setTimeout( resolve, 10000 );
});
this.clock.tick( 10001 );
return promise;
});
ãã®æå¿
executor
é¢æ°ãåæçã«å®è¡ãïŒ ES2015ä»æ§ãåç
§ïŒãæ°ããã¿ã€ã ã¢ãŠããå¹æçã«èšå®ããŸããprocess
ïŒãŸãã¯ãã©ãŠã¶ïŒã¯æ°ããããã£ãã¯ããã¹ã¿ãã¯ããçŽæã解決ããŠæ®ãã®Thenables
ãåŒã³åºããŸãããããã°ã§ã¯ãªããã®ãšããŠéããŸãã
@ fatso83ããªãã説æããæ¹æ³ã§ãã¹ãã«åæ Œããæ¹æ³ãããããŸããã ãµã³ãã«ãã¹ãããã¹ããªããžããªã«è¿œå ããŸããããããã§ãtimeout of 2000ms exceeded. Ensure the done() callback is being called in this test.
ãååŸããŸã
ãããåç
§ããŠãã ããïŒ https ïŒ//github.com/JustinLivi/sinon-promises-test/blob/master/test.js#L60
ãŸããç§ãç¥ãéãããã®ãã¹ãã¯ãŸã 倱æããŸãïŒ https ïŒ//github.com/JustinLivi/Sinon.JS/commit/de106e6db2f5cc076b7e3a78635bd9ae2b6be1c2
ç·šéïŒ @fpirschã«ããã³ã¡ã³ãã«åºã¥ããšães6 promiseããªãã£ã«ã䜿çšããŠãããšãã ãã®ããã§ããïŒ ãã«ãŒããŒããªã©ã®ä»£æ¿ã©ã€ãã©ãªãè©Šãã人ã¯ããŸããïŒ
@ fatso83ããã¯return promise
ã®åé¡ã§ã¯ãããŸããã
ç§ã®å Žåãããã¯ãã¡ã³ãã ïŒå€ããçŽæãªãïŒ+ es6-promises polyfill + sinon.jsã®åé¡ã§ãã æè¿ã®ãã©ãŠã¶ã§ã¯ãpromiseã¯è§£æ±ºããããã¹ãã¯æ£åžžã«å®è¡ãããŸãããpromise polyfillã䜿çšãããšãã¿ã€ããŒãåœé ããããšãã«Promiseã解決ãããããšã¯ãããŸããã
@JustinLiviãš@fpirsch ïŒãã®ãã°ã¬ããŒãã¯_native_promiseã®äœ¿çšã«é¢ãããã®ã§ããã @JustinLiviã®ãã¹ããããžã§ã¯ãães6-promise
ã䜿çšããŠããã®ã§ããããä¿èšŒããããšã¯ã§ããŸããã ä»ã®ããªãã£ã«ã«ã€ããŠãåãããšãèšããŸããããã¯å¥ã®åé¡ã§ãã ç§ã¯ãããããŒã5ãš6ã§ãã¹ãããŸããããããã¯ãã€ãã£ãã®promiseããµããŒãããŠããŸãã
åã®æçš¿ãããµã³ãã«ã³ãŒããã³ããŒããŠè²Œãä»ããŠå®è¡ããŸãïŒMochaãšSinonãããªã€ã³ã¹ããŒã«ãããŠããŸãïŒã
$ pbpaste > test.js
$ mocha test.js
sinon.useFakeTimers()
â should resolve a promise after ticking
1 passing (12ms)
@fpirsch ïŒ return promise
ã®åé¡ã ãšã¯æ±ºããŠèšããŸããã§ããã ç§ã¯åœŒããã¹ããããçã圢åŒã§æžãçŽãããšãã§ãããšã¡ããã©è¿°ã¹ãŸããã ä¿®æ£ã§ã¯ãªãããã³ãã ããããããªãã¯ããã€ãã®è²Žéãªæ
å ±ãæäŸããŸããïŒããã¯ãã€ãã£ããã©ãŠã¶ã§åäœããŸãããpromiseããªãã£ã«ã§ã¯å€±æããŸãã ããã¯ããªãã®çŽæã®libã®ããã§ãããSinonã®ããã§ã¯ãããŸããã ããªãã®promiselibã¯ãããããsetTimeout
ãšãã®åéããã£ãã·ã¥ãããé¢æ°ãããã«äŸåããŠãããããå£ããŠããŸãã pinkyswear
libã«ããã«å¯Ÿããä¿®æ£ãäžåºŠå®è£
ããã®ã§ãäžæè°ã§ã¯ãããŸããã
es6-promise
ã®ãœãŒã¹ããã§ãã¯ããŸããããsetTimeoutãžã®åç
§ããã£ãã·ã¥ããªããããsinonãè¡ãããšã®åœ±é¿ãåããŸãã ããããç§ã¯ãã®ã¹ã±ãžã¥ãŒã©ãŒãããã§ã©ã®ããã«é¢é£ããŠããããèŠãããšãã§ããŸãã...ã¿ã€ã ã¢ãŠãã¹ã±ãžã¥ãŒã©ãŒã«ãã©ãŒã«ããã¯ããåã«ããªãã£ã«ãè©Šã¿ãä»ã®ãªãã·ã§ã³ã®èšå€§ãªãªã¹ãããããŸãã ãã®ãã©ãŒã«ããã¯ã«å°éãããã©ãŠã¶ã¯ãã¹ãŠå€ããªããã°ãªããŸãã:)
ããããšã«ããã @ fpirschãš@JustinLiviãèšåããŠããã®ã¯ãSinonãšããªãã£ã«ã®éã®çžäºéçšæ§ã«é¢ããåé¡ã§ãã ãããŠããã¯å¥ã®åé¡ã§ãã SinonãATMã«ã€ããŠã©ã®ããã«ã§ãããã¯ããããŸãããïŒPRã¯es6-polyfill
ã«ãªãå¯èœæ§ãé«ããªããŸãïŒããããSinonã®åé¡ã§ããå Žåã¯ãæ°ããåé¡ãéããŠãã ããã
PS @ropezããã®ãã³ãã¯ã promise-polyfill
ã䜿çšããããšã ã£ããšæããŸããããã¯ãæå°éã®ããªãã£ã«ã«ã€ããŠãå®éã«æšå¥šãããŠããŸãããäžãããããã®ãšã¯éã®çç±ã§ãã @mroderickã¯ã1æïŒ @ropezã³ã¡ã³ãã®æ°ãæåŸïŒã«ãã®ãããžã§ã¯ãã«ããããé©çšããŠã setTimeout
ãžã®åç
§ããã£ãã·ã¥ããçŽæã_ã©ã®ãããªã·ãã³ãè¡ã£ãŠããŠã_ã°ããŒãã«setTimeout
åç
§ã«è§£æ±ºãããããã«ããŸããã 詳现ã«ã€ããŠã¯ãtaylorhakes / promise-polyfillïŒ15ãåç
§ããŠãã ããã
@ fatso83æ
å ±ãããããšãã æ®å¿µãªããã @ mroderickãpromise-polyfill
ã«å¯ŸããŠè¡ã£ãããã«ã setTimeout
ãžã®åç
§ãä¿åããŠããç§ã®å Žåã¯æ©èœããŸããã es6-promise
ãpromise-polyfill
ã«çœ®ãæããããšããããŸãã:-(
ç·šéïŒããã¯åçŽãªãã¡ã³ãã +ã¢ã«ã¹ã¿ãã¯ã§ã¯æ©èœããŸãããã«ã«ããå«ãå®å
šãªã¹ã¿ãã¯ã§ã¯æ©èœããŸããã ããã«ããããããŠããã
@ fatso83ããã«äŸã瀺ããŸãïŒ faketimers
çµå±ã®ãšãããåé¡ã¯ã«ã«ãã«ããã®ãããããŸãã...ç§ã¯ãããããæ·±ãæãäžããããšããŸãã
@fpirsch ïŒããªãã¯äœãã«åãçµãã§ãããšæããŸãã ããªãã@JustinLiviãããã¹ãã©ã³ããŒãšããŠã«ã«ãã«äŸåããŠããŸãã ãããã¯éåžžã«äŒŒãŠããããã§ãã PSãžã£ã¹ãã£ã³ããã§ã«åé¡ã瀺ãããã¹ãã±ãŒã¹ãæäŸããŠããã®ã§ãã³ã¡ã³ãã¯å®å šã«äžèŠã ãšæã£ãã®ã§åé€ããŸããããããªãã®ãµã³ãã«ãããžã§ã¯ãã¯ããããã«ã«ãã®ãã®ã§ãããšãã仮説ã匷åããŸããããããšãïŒ
ããã¯é¢é£ããŠãããããããŸããããããããããŸããã 以äžã®3çªç®ã®ãã¹ãã倱æããã®ã¯ãªãã§ããïŒ ç¹å®ã®å€±æã¯ãå žåçãªãã¹ãã¿ã€ã ã¢ãŠãã§ãã
Error: timeout of 2000ms exceeded. Ensure the done() callback is being called in this test.
describe.only('working', () => {
let clock;
beforeEach(() => { clock = Sinon.useFakeTimers(); })
afterEach(() => { clock.restore() })
const delay = (ms) => (
new Promise((resolve/* , reject */) => {
setTimeout(resolve, ms)
})
);
it('1 OK', () => {
const promise = new Promise((resolve) => {
setTimeout(resolve, 100)
})
clock.tick(200)
return promise
})
it('2 OK', () => {
const promise = delay(100)
clock.tick(200)
return promise
})
it('3 FAIL', () => {
const promise = delay(50).then(() => delay(50))
clock.tick(200)
return promise
})
})
@jasonkuhrt clock.tickããšã°ãŒãã¥ãŒã¿ãåæçã«åŠçããéåæã®æ§è³ªã®ããã«.then(...)
ãå®è¡ãããªãããã3çªç®ã®ãã¹ãã¯å€±æããŸãã
onFulfilledãŸãã¯onRejectedã¯ãå®è¡ã³ã³ããã¹ãã¹ã¿ãã¯ã«ãã©ãããã©ãŒã ã³ãŒãã®ã¿ãå«ãŸãããŸã§åŒã³åºããªãã§ãã ããã
@ fatso83ã¿ã€ããŒãè¿œå ããé£éãããã¹ã«é¢ããlolexéçºè ã®ç«å ŽãããããŸããã çŸåšã®å¶éã«ã€ããŠã¯ãå°ãªããšãããã¥ã¡ã³ãã§è©³ãã説æããå¿ èŠããããŸãã
ããããµããŒãããå¿
èŠããããã©ããã«å¿ããŠããã®åé¡ãå床éãããšãã§ãïŒãŸãã¯æ°ããåé¡ãéãããšãã§ããŸãïŒã lolexã®æ°ããåé¡ã«äŸåããŸãã
ãŸãããã®ãŠãŒã¹ã±ãŒã¹ïŒã¿ã€ããŒãè¿œå ãããã§ãŒã³ã®çŽæïŒãèæ
®ã«å
¥ããå¿
èŠãããå Žåãããã¯æ··ä¹±ããlolex APIã®å€æŽã«ã€ãªãããšæããŸãïŒAFAIK clock.tickã¯éåæã§ããå¿
èŠããããŸãïŒã
@gautazãããä»ã¯çã«ããªã£ãŠããŸãã 説æããŠãããŠããããšãïŒ
lolex
ã¯åæã©ã€ãã©ãªã§ããã @ jasonkuhrtã®åé¡ã解決ããæ¹æ³ãå®å
šã«ã¯ããããŸããã PRãèªç±ã«æäŸããŠãã ããããã ãã clock.tick
ãå€æŽããããšã¯ããŸãé
åçã§ã¯ãããŸããã ããããè¿œå ã®éåæã¡ãœãããå¿
èŠã§ãã
ç§ã¯ãããã¹ãšã¯ããã¯ãã£ãã¯ã«é¢ããŠå€ãã®åé¡ãæ±ããããšã¯ãããŸããã§ããããããã¯ããããããããåæããŠããããšã確èªãããã®éã«äœåãªã¯ããã¯ãã£ãã¯ãè¿œå ããããã§ãã
@ fatso83ããã§ããéåæã®tick
ãè¿œå ãããšãæ··ä¹±ãå°ãªããªããŸãïŒå®éã«ã¯ãŸã£ããæ··ä¹±ããŸããïŒã
ãããã£ãŠã asyncTick
ã®ãããªãã®ãé©åãããããŸããã æéãããã°èª¿ã¹ãŠã¿ãŸãã
@gautazã¯ã lolex
ã«ããããæäŸããããšã«åãæãã£ãããšããããã©ããã ãç¥ãããã§ããïŒ
@ fatso83ããã«ã¡ã¯ãç§ã¯æšå¹Žèªåã®åŽã§æ¯åºãå§ããŸããããä»ã®ãšããä»äºãçµããæéã¯ãããŸããã
åãåé¡ã§ã€ãŸãããååãããã®ã§ãåé¡ã倧ãããªã£ãŠè¿œå ã®æéãæäŸã§ããããšãé¡ã£ãŠããŸãã
ãã®éã«ããã®ç¹å®ã®ç¹ã§lolex APIã«é¢ããŠäœãå€æŽããããŸãããïŒ
ããã¹ãã§ã¯ãããŸããã éå»å幎éã®ã³ãŒãããŒã¹ã®å€æŽã¯ã»ãšãã©ãããŸããã ããªãå®å®ããŠããŸãã
ããã§ç°¡åãªåé¿çããšããã£ã³ã¹ã¯ãããŸããïŒ åãåé¡ããããŸãã ç§ã«ã¯2ã€ã®çŽæãããããããã¯setTimeoutã«ãã£ãŠè§£æ±ºãããŸãã 解決ããåã2çªç®ã®è§£æ±ºåãæåã®è§£æ±ºåŸããããŠãã¹ãŠã®è§£æ±ºåŸã«ç¢ºèªããå¿ èŠããããŸãã
å¿
èŠãªã®ã¯ãpromiseãã€ã¯ãã¿ã¹ã¯ãå®è¡ãããã®ãåŸ
ã€ããšã ãã§ãã
ãããã£ãŠã次ã®ã¢ãããŒãã¯å®ç§ã«æ©èœããŸãã
const tick = async (ms) => {
clock.tick(ms);
};
it("imitates promise fulfill when called once", async () => {
new Promise(resolve => setTimeout(resolve, 400)).then(callback);
expect(callback.callCount).to.eql(0);
await tick(200);
expect(callback.callCount).to.eql(0);
await tick(200);
expect(callback.callCount).to.eql(1);
});
@jakwuhã®ããªãã¯ã¯ç§ã®ããã«æ©èœããŸããïŒããŒã8ããã©ã³ã¹ãã€ã«ãªãããã€ãã£ããããã¹ïŒããã ãã then
ã³ãŒã«ããã¯ã¯ãã£ãã¯ã«ãã£ãŠå»¶æãããŸããã
æŽæ°ãããã³ã¡ã³ãïŒç§ã®å
ã®ã³ã¡ã³ãïŒäžèšïŒã®è§£æ±ºçã«ã¯åé¡ããããŸãã å®éã«ãã¹ãŠããã©ãã·ã¥ããããã«ãè€æ°ã®é£ç¶ãawait Promise.resolve()
åŒã³åºããå¿
èŠã«ãªãããšããããŸããã ãããããå°ãããŸãããããã«èŠãããã®ã§ãïŒ
beforeEach(function() {
const originalSetImmediate = setImmediate;
this.clock = sinon.useFakeTimers();
this.tickAsync = async ms => {
this.clock.tick(ms);
await new Promise(resolve => originalSetImmediate(resolve));
}
});
afterEach(function() {
this.clock.restore();
});
å ã®ã³ã¡ã³ã[èŠåïŒäžèšã®ã³ãŒããšåæ§ã«æ©èœããŸããã]
tick
ãã«ããŒã«éåæã®ã£ãããè¿œå ãããšãåé¡ãä¿®æ£ãããŸããã
`` `js
const tick = asyncïŒmsïŒ=> {
clock.tickïŒmsïŒ;
Promise.resolveïŒïŒ;ãåŸ ã€
};
ãã®åéã§Sinonãæ¹åããäœæ¥ïŒå®éã«ã¯ããã®å
åŒãããžã§ã¯ãlolex
ïŒã«é¢å¿ã®ãã人ã¯ãããã§ã®ãã£ã¹ã«ãã·ã§ã³ã確èªããŠãã ããã
æãåèã«ãªãã³ã¡ã³ã
å¿ èŠãªã®ã¯ãpromiseãã€ã¯ãã¿ã¹ã¯ãå®è¡ãããã®ãåŸ ã€ããšã ãã§ãã
ãããã£ãŠã次ã®ã¢ãããŒãã¯å®ç§ã«æ©èœããŸãã