2017-10-15 126 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

我建议你也可以使用'sinon'与摩卡,它提供了你的方式间谍/嘲讽的东西,并多次操作对于这些情况timeout'的'例如:https://github.com/mochajs/摩卡/维基/ Spies – quirimmo

回答

3

我认为你正试图测试你不应该做的事情。您的测试名称建议您不要相信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(); 
    } 
} 
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

抱歉挑剔,通过调用'done'完成异步的概念是完全完美的。但是如果你想测试3秒后是否调用了'console.log',你需要在该方法上创建一个间谍,并检查该方法是否被调用了正确的参数。这并不意味着再次调用'console.log'。 但是,'done'的逻辑完全是完美的。 – quirimmo

相关问题