Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/467.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 存根设置超时函数_Javascript_Node.js_Unit Testing_Sinon - Fatal编程技术网

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