考虑以下功能,
function helloAfter100ms(){
setTimeout(function(){
console.log('hello');
},100)
}
使用mocha测试代码,
describe('#helloAfter100ms()',function(){
it('console logs hello ONLY after 100ms',function(){
// what should go here
})
})
答案 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)
})
})