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

时间:2017-01-02 09:30:58

标签: javascript unit-testing typescript sinon

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

  1. 致电承诺并等待其履行
  2. 如果返回值为正,则停止。否则,在减少重试次数的同时重试。
  3. 以下是实施:

    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);
    }
    

    使用sinon假定时器的单元测试:

    it.only('Test', function() {
    
        let func = sinon.stub();
        func.returns(Promise.resolve(false));
    
        Utils.retryIfFails(func, 2);
    
        chai.expect(func.callCount).eq(1);
        clock.tick(1001);
        chai.expect(func.callCount).eq(2);
        clock.tick(1001);
        chai.expect(func.callCount).eq(3);
    })
    

    单元测试输出:

      AssertionError: expected 1 to equal 2
      + expected - actual
    
      -1
      +2
    

    基本上,该函数从不调用自身。 Sinon假定时器部分http://sinonjs.org/docs/#clock中的代码工作正常。这个功能有什么不同?

1 个答案:

答案 0 :(得分:0)

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

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

另外,我不确定假定时器是如何工作的,但是你可能想用较低的值调用tick两次,所以定时器会被触发两次(但是,我不是确定这部分。)