【发布时间】:2017-05-16 09:44:18
【问题描述】:
我想测试一个递归函数,它会重试输入函数,直到它成功(返回 true)。
- 调用一个 promise 并等待它的实现
- 如果返回值为正,则停止。否则,请在减少重试次数的同时重试。
这里是实现:
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