λ€μ ν
μ€νΈμμλ νμΈλ μ½μμ λν μ½λ°±μ΄ ν
μ€νΈ λ΄μμ νΈμΆλ κ²μΌλ‘ μμνμ΅λλ€. λΆλͺ
ν λ€μ΄ν°λΈ Promiseλ μ½λ°±μ λκΈ°μ μΌλ‘ νΈμΆνμ§ μμ§λ§ setTimeout(callback, 0)
μ μ μ¬ν λ°©μμΌλ‘ νΈμΆλλλ‘ μμ½ν©λλ€. κ·Έλ¬λ μ€μ λ‘ setTimeoutμ μ¬μ©νμ§ μμΌλ―λ‘ sinonμ κ°μ§ νμ΄λ¨Έ ꡬνμ 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 κ°μ²΄λ₯Ό κ΅μ²΄νλ©΄ μ΄κ²μ΄ κ°λ₯νλ€κ³ νμ ν©λλ€. κ·Έλ κ² νλ €λ©΄ κΈ°λ³Έ ꡬνμ μμ‘΄ν μ μκΈ° λλ¬Έμ μ½μ μ¬μμ κ²½μ ꡬνμ΄ νμν μ μμ΅λλ€.
λλ λν¬λ€μ΄ μ¬κΈ°μ μ§μ ν λ¬Έμ λ₯Ό λ³Έλ€. κ·Έλ¬λ μ½μ μ¬μκ³Ό sinon λ¬Έμλ₯Ό κΈ°λ°μΌλ‘ νμ¬ μ΄κ²μ΄ "μλν΄μΌ"νλ κ²μ²λΌ 보μλ νΉμ μν©μ μΈκΈνκ³ μΆμμ΅λλ€. μ΄ κ²½μ° ν μ€νΈμ μ½μμ λ°ννμ§λ§ κ°μ§ νμ΄λ¨Έλ₯Ό μ¬μ©νλ©΄ μ½μμ΄ ν΄κ²°λμ§ μλ κ²μ²λΌ 보μ λλ€.
μ΄ λ κ°μ§ ν μ€νΈκ° λͺ¨λ μλν΄μΌ νλ κ² κ°μμ§λ§ 첫 λ²μ§Έ ν μ€νΈλ ν΅κ³Όνκ³ λ λ²μ§Έ ν μ€νΈλ μ€ν¨νμ΅λλ€. λλ mochaμ ν¨κ» chai-as-promised νλ¬κ·ΈμΈκ³Ό ν¨κ» chaiλ₯Ό μ¬μ©νκ³ μλλ° "timeout of 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;
});
});
μ°λ¦¬κ° μ¬μ©νλ ν΄κ²° λ°©λ²μ ν μ€νΈλ₯Ό μ€νν λ κΈ°λ³Έ μ½μ ꡬνμ setTimeoutμ μμ‘΄νλ κ°λ¨ν κ²μΌλ‘ λ°κΎΈλ κ²μ λλ€.
window.Promise = require('promise-polyfill')
Sinon.JSλ useFakeTimersλ₯Ό νΈμΆν λ κ°λ¨ν λμΌν μμ μ μνν μ μμ΅λλ€.
@JustinLivi κ° μλ£λκΈ° μ μ 볡μνμ΅λλ€. +1:
κ·Έλμ, μ΄λ€ ν΄κ²°μ±
μ΄λ ν΄κ²° λ°©λ²μ΄ μμ΅λκΉ?
λ΄ ν
μ€νΈμμ κ·Έλ κ² λ§νκΈ° λλ¬Έμ λ΄ μ±μ μμ νκ³ ES6 μ½μ μ¬μ©μ μ€μ§ν μ μμ΅λλ€. :)
κΈ°λ³Έ μ½μμ΄ μλλΌ es6-promise ν΄λ¦¬νμ λ¬Έμ κ° μμ΅λλ€.
@JustinLivi μ clock.restore()
μ루μ
μ΄ λ¬Έμ λ₯Ό ν΄κ²°ν©λλ€.
μ΄ λ¬Έμ κ° μ μ¬κΈ°μμ μ€λ«λμ λ¨μ μλμ§ λͺ¨λ₯΄κ² μ§λ§ μ΄κ²μ Sinonμ λ¬Έμ κ° μλλλ€. Promiseλ₯Ό μ¬μ©νλ κ²μ λ³Έμ§μ μΌλ‘ λΉλκΈ° λ‘μ§μ ββμννλ κ²μ λλ€. κ·Έλλ μ¬κΈ°μ λͺ¨λ ν μ€νΈλ λκΈ° λ Όλ¦¬λ₯Ό μ¬μ©ν©λλ€(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λ₯Ό μ¬μ©νλ κ²½μ° Promisesλ₯Ό μ¬μ©ν λ μμ λμΌν μ½λμ "λ°λ‘ κ°κΈ°" λ²μ μ΄ μμ΅λλ€. Promiseλ₯Ό ν μ€νΈ νλ μμν¬μ μ§μ λ°ννκΈ°λ§ νλ©΄ λ©λλ€.
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 polyfillμ μ¬μ©ν λμΈ κ² κ°μ΅λλ€. λΈλ£¨λ²λμ κ°μ λ체 λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©ν΄ λ³Έ μ¬λμ΄ μμ΅λκΉ?
@fatso83 μ΄κ²μ return promise
λ¬Έμ κ° μλλλ€.
μ κ²½μ°μλ Phantom(ꡬμ, μ½μ μμ) + es6-promises polyfill + sinon.js λ¬Έμ μ
λλ€. μ΅μ λΈλΌμ°μ μμλ μ½μμ΄ ν΄κ²°λκ³ ν
μ€νΈκ° μ μ€νλμ§λ§ μ½μ ν΄λ¦¬νμ μ¬μ©νλ©΄ νμ΄λ¨Έκ° κ°μ§μΌ λ μ½μμ΄ ν΄κ²°λμ§ μμ΅λλ€.
@JustinLivi λ° @fpirsch : μ΄ λ²κ·Έ λ³΄κ³ μλ _native_ Promise μ¬μ©μ κ΄ν κ²μ
λλ€. es6-promise
λ₯Ό μ¬μ©νλ @JustinLivi μ ν
μ€νΈ νλ‘μ νΈλ₯Ό 보μμΌλ―λ‘ λ³΄μ¦ν μ μμ΅λλ€. λ€λ₯Έ ν΄λ¦¬νλ λ§μ°¬κ°μ§μ
λλ€. 그건 λ λ€λ₯Έ λ¬Έμ μ
λλ€. κΈ°λ³Έ μ½μμ μ§μνλ λ
Έλ 5 λ° 6μΌλ‘ μ΄κ²μ ν
μ€νΈνμ΅λλ€.
μ΄μ κ²μλ¬Όμ μμ μ½λλ₯Ό 볡μ¬νμ¬ λΆμ¬λ£κ³ μ€ν(Mocha λ° Sinon μ¬μ μ€μΉ):
$ pbpaste > test.js
$ mocha test.js
sinon.useFakeTimers()
β should resolve a promise after ticking
1 passing (12ms)
@fpirsch : return promise
λ¬Έμ λΌκ³ λ§ν μ μ΄ μμ΅λλ€. λλ κ·Έκ° ν
μ€νΈλ₯Ό λ 짧μ νμμΌλ‘ λ€μ μμ±ν μ μλ€κ³ μΈκΈνμ΅λλ€. μμ μ΄ μλλΌ νμ
λλ€. κ·Έλ¬λ λͺ κ°μ§ κ·μ€ν μ 보λ₯Ό μ 곡νμ΅λλ€. κΈ°λ³Έ λΈλΌμ°μ μμλ μλνμ§λ§ μ½μ ν΄λ¦¬νμμλ μ€ν¨ν©λλ€. κ·Έκ²μ Sinonμ΄ μλλΌ λΉμ μ promise libμ μλͺ»μ
λλ€. κ·νμ μ½μ λΌμ΄λΈλ¬λ¦¬λ μλ§λ setTimeout
λ° μΉκ΅¬λ₯Ό μΊμνμ§ μκ³ κΈ°λ₯μ μμ‘΄νλ―λ‘ μ€λ¨λ©λλ€. pinkyswear
libμμ μ νν μ΄ λ¬Έμ λ₯Ό μμ ν μ μ΄ μμΌλ―λ‘ λΉμ°ν©λλ€.
es6-promise
μ μμ€λ₯Ό νμΈνκ³ setTimeout μ λν μ°Έμ‘°λ₯Ό μΊμνμ§ μμΌλ―λ‘ sinonμ΄ νλ λͺ¨λ κ²μ μν₯μ λ°μ΅λλ€. κ·Έλ¬λ λλ κ·Έ μ€μΌμ€λ¬κ° μ¬κΈ°μμ μ΄λ»κ² κ΄λ ¨μ΄ μλμ§ μμ§ λͺ»ν©λλ€ ... λν ν΄λ¦¬νμ΄ νμμμ μ€μΌμ€λ¬λ‘ λμκ°κΈ° μ μ μλν λ€λ₯Έ μ΅μ
μ κ±°λν λͺ©λ‘μ΄ μμ΅λλ€ . κ·Έ λ체μ μ°©λ₯νλ λͺ¨λ λΈλΌμ°μ λ κ³ λμ¬μΌ ν©λλ€. :)
κ·Έλ¬λ μ΄μ¨λ @fpirsch μ @JustinLivi κ° μΈκΈν κ²μ Sinonκ³Ό ν΄λ¦¬ν κ°μ μνΈ μ΄μ©μ±μ κ΄ν λ¬Έμ μ
λλ€. κ·Έλ¦¬κ³ κ·Έκ²μ λ λ€λ₯Έ λ¬Έμ μ
λλ€. Sinonμ΄ ATMμ λν΄ λ§μ κ²μ ν μ μλ λ°©λ²μ μμ§ λͺ»νμ§λ§(λͺ¨λ PRμ es6-polyfill
λ‘ λλ κ°λ₯μ±μ΄ λ λμ), μ΄κ²μ΄ Sinon λ¬Έμ μΈ κ²½μ° μμ λ‘κ² μ λ¬Έμ λ₯Ό μ¬μμμ€.
μΆμ : @ropez μ νμ promise-polyfill
λ₯Ό μ¬μ©νλ κ²μ΄μμΌλ©° μ΄λ μ€μ λ‘ μ΅μ ν΄λ¦¬νμ λν κΆμ₯ μ¬νμ΄κΈ°λ νμ§λ§ μ 곡λ κ²κ³Ό λ°λμ μ΄μ μ
λλ€. @mroderick μ setTimeout
μ λν μ°Έμ‘°λ₯Ό μΊμνκΈ° μν΄ 1μμ ν΄λΉ νλ‘μ νΈλ₯Ό ν¨μΉνμ΅λλ€( @ropez μ£Όμ ν λͺ κ°μ). κ·Έλ¬λ©΄ μ½μμ΄ _sinonμ΄ λ¬΄μμ νκ³ μλ _ κΈλ‘λ² setTimeout
μ°Έμ‘°λ‘ ν΄κ²°λ©λλ€. μμΈν λ΄μ©μ taylorhakes/promise-polyfill#15λ₯Ό μ°Έμ‘°νμΈμ.
@fatso83 μ 보 κ°μ¬ν©λλ€. λΆννλ @mroderick μ΄ promise-polyfill
μ λν΄ νλ κ²μ²λΌ setTimeout
μ λν μ°Έμ‘°λ₯Ό μ μ₯νλ κ²μ μ κ²½μ°μλ μλνμ§ μμ΅λλ€. es6-promise
λ₯Ό promise-polyfill
λ‘ λ°κΎΈμ§ μμ΅λλ€. :-(
νΈμ§: λ¨μν ν¬ν
+λͺ¨μΉ΄ μ€νμμλ μνλμ§λ§ μΉ΄λ₯΄λ§κ° μλ μ 체 μ€νμμλ μνλμ§ μμ΅λλ€. λ무 νΌκ³€ν©λλ€.
@fatso83 μ¬κΈ°μ μλ₯Ό λ€κ² μ΅λλ€: faketimers
κ²°κ΅ Karmaμ λ¬Έμ κ° μμ μ μμ΅λλ€. μ΄ λ¬Έμ μ λν΄ λ κΉμ΄ νκ³ λ€λλ‘ λ
Έλ ₯νκ² μ΅λλ€.
@fpirsch : λκ° νκ³ μλ κ² κ°μμ. λΉμ κ³Ό @JustinLivi λͺ¨λ μΉ΄λ₯΄λ§λ₯Ό ν μ€νΈ λ¬λλ‘ μ¬μ©νκ³ μμ΅λλ€. κ·Έλ€μ λ§€μ° λΉμ·ν΄ 보μ λλ€. μΆμ : Justinμ΄ λ¬Έμ λ₯Ό 보μ¬μ£Όλ ν μ€νΈ μ¬λ‘λ₯Ό μ΄λ―Έ μ 곡νκΈ° λλ¬Έμ μμ ν λΆνμνλ€κ³ μκ°νμ¬ λ΄ μ견μ μμ νμ§λ§ κ·νμ μμ νλ‘μ νΈλ μ΄κ²μ΄ Karma μΌμ΄λΌλ κ°μ€μ κ°νν©λλ€. κ°μ¬ν©λλ€!
μ΄κ²μ κ΄λ ¨μ΄ μμ μ μμ§λ§ νμ€νμ§ μμ΅λλ€. μλμ μΈ λ²μ§Έ ν μ€νΈκ° μ€ν¨νλ μ΄μ λ 무μμ λκΉ? νΉμ μ€ν¨λ μΌλ°μ μΈ ν μ€νΈ μκ° μ΄κ³Όμ λλ€.
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(...)
κ° μ€νλμ§ μκΈ° λλ¬Έμ μ€ν¨ν©λλ€.
onFulfilled λλ onRejectedλ μ€ν 컨ν μ€νΈ μ€νμ νλ«νΌ μ½λλ§ ν¬ν¨λ λκΉμ§ νΈμΆλμ§ μμμΌ ν©λλ€.
@fatso83 νμ΄λ¨Έ λ₯Ό μΆκ°νλ μ²΄μΈ νλΌλ―Έμ€μ λν λ‘€λ μ€ κ°λ°μμ μ μ₯μ λͺ¨λ₯΄κ² μ΅λλ€. νμ¬ μ ν μ¬νμ μ΅μν λ¬Έμμ μμΈν λμ μμ΄μΌ ν©λλ€.
μ΄κ²μ΄ μ§μλμ΄μΌ νλμ§ μ¬λΆμ λ°λΌ μ΄ λ¬Έμ λ λ€μ μ΄λ¦΄ μ μκ³ (λλ μ λ¬Έμ κ° μ΄λ¦΄ μ μμ) lolex μ μ λ¬Έμ μ μ’
μλ μ μμ΅λλ€.
λν μ΄ μ¬μ© μ¬λ‘(νμ΄λ¨Έλ₯Ό μΆκ°νλ μ°κ²° μ½μ)λ₯Ό κ³ λ €ν΄μΌ νλ κ²½μ°, μ΄λ‘ μΈν΄ lolex API μμ μ΄ μ€λ¨λ μ μμ΅λλ€(AFAIK clock.tick μ λΉλκΈ°μμ΄μ΄μΌ ν¨).
@gautaz μ μ΄μ μ΄ν΄κ° λ©λλ€. μ€λͺ ν΄μ£Όμ μ κ°μ¬ν©λλ€!
lolex
λ λκΈ°ν λΌμ΄λΈλ¬λ¦¬μ΄κ³ @jasonkuhrt μ λ¬Έμ λ₯Ό μ΄λ»κ² ν΄κ²°ν΄μΌ ν μ§ μμ ν λͺ¨λ₯΄κ² μ΅λλ€. μμ λ‘κ² PRμ μ 곡ν μ μμ§λ§ clock.tick
λ₯Ό μμ νλ κ²μ κ·Έλ€μ§ 맀λ ₯μ μ΄μ§ μμ΅λλ€. μ°¨λΌλ¦¬ μΆκ° λΉλκΈ° λ°©λ²μλ³΄κ³ μΆμ΅λλ€.
λλ μ½μκ³Ό μκ³ λλ±κ³Ό κ΄λ ¨νμ¬ λ§μ λ¬Έμ κ° μμμ§λ§ μλ§λ κ·Έκ²μ΄ λκΈ°μμ΄κ³ κ·Έ μ¬μ΄μ μΆκ° μκ³ ν±μ μΆκ°ν κ²μ 보μκΈ° λλ¬ΈμΌ κ²μ λλ€.
@fatso83 λ§μ΅λλ€ . λΉλκΈ° tick
λ₯Ό μΆκ°νλ©΄ λ λ°©ν΄κ° λ©λλ€(μ¬μ€ μ ν λ°©ν΄κ° λμ§ μμ).
λ°λΌμ asyncTick
μ κ°μ κ²μ΄ μ ν©ν μ μμ΅λλ€. μκ°μ΄ λλ©΄ μ‘°μ¬νκ² μ΅λλ€.
@gautaz lolex
μ ν¨μΉλ₯Ό μ 곡ν κΈ°νκ° μμλμ§ κΆκΈν©λλ€.
@fatso83 μλ
νμΈμ, μ λ μλ
μ μ μμμ μ§μ μ μμνμ§λ§ μ§κΈμ κ·Έ μΌμ λλΌ μκ°μ΄ μμ΅λλ€.
λμκ²λ κ°μ λ¬Έμ λ‘ κ±Έλ € λμ΄μ§ λλ£κ° μμΌλ―λ‘ λ¬Έμ κ° λμκ² μΆκ° μκ°μ μ 곡ν λ§νΌ μΆ©λΆν 컀μ§κΈ°λ₯Ό λ°λ λΏμ
λλ€.
κ·Έ λμ μ΄ νΉμ μ§μ μμ lolex APIμ κ΄λ ¨νμ¬ λ³κ²½ μ¬νμ΄ μμ΅λκΉ?
κ·Έκ²μ μμ΄μΌν©λλ€. μ§λ λ°λ λμ μ½λλ² μ΄μ€μ κ±°μ λ³νκ° μμμ΅λλ€. κ½€ μμ μ μ λλ€.
μ¬κΈ°μ κ°λ¨ν ν΄κ²° λ°©λ²μ΄ μμ΅λκΉ? κ°μ λ¬Έμ κ° μμ΅λλ€. λ κ°μ§ μ½μμ΄ μμΌλ©° setTimeoutμΌλ‘ ν΄κ²°λ©λλ€. ν΄κ²° μ , λ λ²μ§Έ ν΄κ²° μ , 첫 λ²μ§Έ ν΄κ²° ν, λͺ¨λ ν΄κ²° ν νλͺ©μ νμΈν΄μΌ ν©λλ€.
λΉμ μ΄ νμλ‘ νλ μ μΌν κ²μ μ½μ λ§μ΄ν¬λ‘νμ€ν¬κ° μ€νλ λκΉμ§ κΈ°λ€λ¦¬λ κ²μ
λλ€.
λ°λΌμ λ€μ μ κ·Ό λ°©μμ΄ μλ²½νκ² μλν©λλ€.
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 μ νΈλ¦μ then
μ½λ°±μ΄ ν±μ μν΄ μ°κΈ°λμλ€λ μ μ μ μΈνκ³ μ μκ² ν¨κ³Όμ μ΄μμ΅λλ€(λ
Έλ 8, νΈλμ€νμΌ μμ, κΈ°λ³Έ μ½μ).
μ
λ°μ΄νΈλ μ견 : λ΄ μλ μ견(μλ)μ μ루μ
μ λ¬Έμ κ° μμ΅λλ€. λλ‘λ μ€μ λ‘ λͺ¨λ κ²μ νλ¬μνκΈ° μν΄ μ¬λ¬ κ°μ μ°μμ μΈ 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 ν± = λΉλκΈ°(ms) => {
clock.tick(ms);
Promise.resolve()λ₯Ό κΈ°λ€λ¦½λλ€.
};
μ΄ μμμμ Sinonμ κ°μ νλ μμ
(μ€μ λ‘λ νμ νλ‘μ νΈ lolex
)μ κ΄μ¬μ΄ μλ μ¬λλ€μ μ¬κΈ°μμ ν λ‘ μ νμΈνμμμ€.
κ°μ₯ μ μ©ν λκΈ
λΉμ μ΄ νμλ‘ νλ μ μΌν κ²μ μ½μ λ§μ΄ν¬λ‘νμ€ν¬κ° μ€νλ λκΉμ§ κΈ°λ€λ¦¬λ κ²μ λλ€.
λ°λΌμ λ€μ μ κ·Ό λ°©μμ΄ μλ²½νκ² μλν©λλ€.