2017-10-15 1 views
1

는 아래 기능, 모카와mocha에서 setTimeout()을 내부적으로 사용하는 함수를 테스트하는 방법은 무엇입니까?

function helloAfter100ms(){ 
    setTimeout(function(){ 
    console.log('hello'); 
    },100) 
} 

테스트 코드, 업데이트

describe('#helloAfter100ms()',function(){ 
    it('console logs hello ONLY after 100ms',function(){ 
    // what should go here 
    }) 
}) 
+0

난 당신이 예를 들어 timeout''이러한 경우에 재료와 시간 조작을 조롱/감시 주셔서 방법을 제공 모카와'도 sinon' 사용하는 것이 좋습니다 mocha/wiki/Spies – quirimmo

답변

3

나는 너가해서는 안되는 것을 시험하려고하는 것 같아. 테스트의 이름은 주어진 시간 초과 후에 setTimeout 함수가 console.log을 호출하는 것을 신뢰하지 않는다는 것을 나타냅니다.

이 코드는 사용자 코드가 아니므로 단위 테스트를 수행하지 않아야합니다. 또한 setTimeout은 제대로 작동하는지 확인할 수 있습니다.

그래서 남은 것은 무엇입니까? 귀하의 코드 - 코드 setTimeout입니다. setTimeout을 올바르게 호출하는지 확인할 수 있습니다.

이 작업을 수행하는 방법에 관해서는 사용할 수있는 두 가지 기능이 있습니다. 첫 번째는 시계를 제어 할 수있는 useFakeTimers입니다. 두 번째는 스파이입니다.이 스파이는 console.log에서 사용해야합니다. https://github.com/mochajs/ :

describe('#helloAfter100ms()',function(){ 
    it('console logs hello ONLY after 100ms',function(){ 
    const clock = sinon.useFakeTimers(); 
    const logSpy = sinon.spy(console, 'log'); 
    helloAfter100ms(); 
    expect(logSpy).to.not.have.been.called; 
    clock.tick(100); 
    expect(logSpy).to.have.been.calledOnce; 
    logSpy.restore(); 
    clock.restore(); 
    } 
} 
0

을 고려해이 같은 :

describe('helloAfter100ms', function(){ 
    it('console logs hello ONLY after 100ms', function(done){ 
     setTimeout(function(){ 
      console.log('hello.'); 
      done(); 
     }, 100) 
    }) 
}) 

참조 : https://mochajs.org/#asynchronous-code

+0

대신에'console.log'를 다시 호출하여 스파이를 생성하고 올바른 매개 변수로 호출되었는지 확인하십시오. – quirimmo

+0

@quirimmo 업데이트되었습니다 !! –

+0

'까다로운'전화를 통한 비동기 개념은 까다롭기 때문에 유감스럽게 생각합니다. 그러나 3 초 후'console.log'가 호출되었는지 테스트하고 싶다면 메소드에 스파이를 생성하고 메소드가 올바른 매개 변수로 호출되었는지 점검해야합니다. 이것은'console.log'를 다시 호출하는 것을 의미하지는 않습니다. 그러나''done'의 논리는 완전히 완벽합니다. – quirimmo