如何在内部使用mocha测试使用setTimeout()的函数?

时间:2017-10-15 11:34:08

标签: javascript mocha

考虑以下功能,

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

使用mocha测试代码,

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

2 个答案:

答案 0 :(得分:6)

我认为您正在尝试测试一些您不应该做的事情。您的测试名称表明您不相信setTimeout函数仅在给定超时后调用console.log

由于这不是您的代码,您可能不应该对其进行单元测试。此外,setTimeout可能是您可以确定正常工作的东西。

那么剩下要测试的是什么?您的代码 - 调用的代码 setTimeout。 您可以确保正确调用setTimeout。

至于如何完成 - 你可以使用两个sinon功能。第一个是useFakeTimers,它可以让你控制时钟。第二个是间谍,您应该在console.log上使用它以确保它被调用。

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();
  }
}

答案 1 :(得分:1)

更新:像这样:

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

参考:https://mochajs.org/#asynchronous-code