【问题标题】:How to unit test a function that calls itself如何对调用自身的函数进行单元测试
【发布时间】:2017-05-16 09:44:18
【问题描述】:

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

  1. 调用一个 promise 并等待它的实现
  2. 如果返回值为正,则停止。否则,请在减少重试次数的同时重试。

这里是实现:

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 中的代码工作正常。这个函数有什么不同?

【问题讨论】:

  • 你的 retryIfFails 需要一个 promise 作为参数。您在超时时将其留空...

标签: javascript unit-testing typescript sinon


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢,我确实忘了把函数作为参数。我把它放进去,但它仍然失败。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-29
  • 1970-01-01
  • 1970-01-01
  • 2014-02-08
  • 2021-10-23
相关资源
最近更新 更多