Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.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_Unit Testing_Typescript_Sinon - Fatal编程技术网

Javascript 如何对调用自身的函数进行单元测试

Javascript 如何对调用自身的函数进行单元测试,javascript,unit-testing,typescript,sinon,Javascript,Unit Testing,Typescript,Sinon,我想测试一个递归函数,它会重试输入函数,直到它成功(返回true) 呼唤承诺并等待它的实现 如果返回值为正值,则停止。否则,请在减少重试次数的同时重试 以下是实施方案: type booleanPromiseFunc = (...args) => Promise<boolean>; export async function retryIfFails(func: booleanPromiseFunc, retryCount: number) { let result

我想测试一个递归函数,它会重试输入函数,直到它成功(返回true)

  • 呼唤承诺并等待它的实现
  • 如果返回值为正值,则停止。否则,请在减少重试次数的同时重试
  • 以下是实施方案:

    type booleanPromiseFunc = (...args) => Promise<boolean>;
    
    export async function retryIfFails(func: booleanPromiseFunc, retryCount: number)
    {
        let result = await func();
    
        if (result)
            return;
    
        if (retryCount == 0)
            return;
    
        setTimeout(retryIfFails, 1000, func, retryCount - 1);
    }
    
    单元测试输出:

      AssertionError: expected 1 to equal 2
      + expected - actual
    
      -1
      +2
    
    基本上,函数从不调用自身。
    Sinon fake timers部分的代码运行良好。此函数有什么不同?

    在递归步骤中调用函数时,不会将布尔承诺函数作为参数传递。你应该做:

    setTimeout(retryIfFails, 1000, func, retryCount - 1);
    

    另外,我不确定伪计时器是如何工作的,但您可能希望使用较低的值调用两次
    勾选
    ,因此计时器将被触发两次(但同样,我不确定这一部分)。

    您的重试需要一个承诺作为参数。你在暂停时把它空着……谢谢,我确实忘了把函数作为参数。我把它放进去了,但还是不行。
    setTimeout(retryIfFails, 1000, func, retryCount - 1);