Javascript 存根设置超时函数
我有个功能,等等Javascript 存根设置超时函数,javascript,node.js,unit-testing,sinon,Javascript,Node.js,Unit Testing,Sinon,我有个功能,等等 async function wait(time) { return new Promise((resolve) => setTimeout(resolve, time)); } 我这样称呼这个等待:wait wait(5000)来自不同的函数 我正在编写单元测试用例,它总是执行wait,每个测试用例等待5s 如何使用Sinon存根setTimeout 我试过: // Skip setTimeOut clock = sinon.useFakeTimers({
async function wait(time) {
return new Promise((resolve) => setTimeout(resolve, time));
}
我这样称呼这个等待:wait wait(5000)代码>来自不同的函数
我正在编写单元测试用例,它总是执行wait,每个测试用例等待5s
如何使用Sinon存根setTimeout
我试过:
// Skip setTimeOut
clock = sinon.useFakeTimers({
now: Date.now(),
toFake: ['setTimeout']
});
await clock.tickAsync(4000);
await Promise.resolve();
但它不起作用。相关帖子:
Github问题:
你可以用两种方法来解决这个问题
考虑您的测试用例是否需要5000ms的延迟
单元测试应该测试代码逻辑,而不是集成测试。因此,您可能只需要进行断言检查,使用参数调用wait
函数。够了。我们不需要在测试用例中等待5000ms的延迟
如果您坚持要使用sinon.useFakeTimers()
和clock.tick(5000)
从相关帖子中,我们可以这样做:
index.ts
:
异步函数等待(时间:数字、时钟?){
返回新承诺((解决)=>{
setTimeout(解析,时间);
时钟和时钟。滴答(时间);
});
}
导出异步函数main(时间,/*用于测试*/时钟?){
等待等待(时间、时钟);
console.log('main');
}
index.test.ts
:
从“/”导入{main};
从“sinon”导入sinon,{SinonFakeTimers};
描述('60617715',()=>{
让时钟:SINONFEKERTIMERS;
在每个之前(()=>{
clock=sinon.useFakeTimers();
});
之后(()=>{
clock.restore();
});
它('should pass',async()=>{
等待主(5000,时钟);
});
});
单元测试结果:
60617715
主要的
✓ 应该通过
1次通过(9ms)
您为什么要这样做?这是一个标准的强制功能。另外,这是Javascript,您不需要模拟库来覆盖全局函数…@JaredSmith单元测试用例执行延迟了50秒,因为我有10个用于该方法的单元测试用例。所以将其传递一个时间0。它将在事件循环的下一个滴答声中触发。然后在1毫秒的延迟上运行测试,而不是4000。但是从单元测试用例中传递0不会影响实际的函数行为。您严重地过度考虑了这一点。如果用5秒的延迟来测试行为很重要,那么对于每一个需要的测试,你都必须吃掉这5秒。如果不是,则传递一个零并结束它。如果您编写代码的方式无法做到这一点,请重写代码。尽管如此,globalThis.setTimeout=(cb)=>cb()代码>