【发布时间】:2019-09-30 22:36:27
【问题描述】:
我使用 JEST 编写了一个测试。 我不知道如何在 JEST 中测试 promise 递归。
在这个测试中,执行递归的重试函数是测试的目标,直到 promise 被解决。
export function retry <T> (fn: () => Promise <T>, limit: number = 5, interval: number = 10): Promise <T> {
return new Promise ((resolve, reject) => {
fn ()
.then (resolve)
.catch ((error) => {
setTimeout (async () => {
// Reject if the upper limit number of retries is exceeded
if (limit === 1) {
reject (error);
return;
}
// If it is less than the upper limit number of retries, execute callback processing recursively
await retry (fn, limit-1, interval);
}, interval);
});
});
}
对上述重试函数进行如下测试。
- 总是传递一个promise来解析,重试函数在第一次执行时被解析
- 第三次通过resolve解析,第三次解析retry函数
我以为用 JEST 写这些的时候应该是这样的。
describe ('retry', () => {
test ('resolve on the first call', async () => {
const fn = jest.fn (). mockResolvedValue ('resolve!');
await retry (fn);
expect (fn.mock.calls.length) .toBe (1);
});
test ('resolve on the third call', async () => {
const fn = jest.fn ()
.mockRejectedValueOnce (new Error ('Async error'))
.mockRejectedValueOnce (new Error ('Async error'))
.mockResolvedValue ('OK');
expect (fn.mock.calls.length) .toBe (3)
});
});
结果失败,出现如下错误。
Timeout-Async callback was not invoked within the 5000 ms timeout specified by jest.setTimeout.Error:
> 40 | test ('resolve on the third call', async () => {
| ^
41 | const fn = jest
42 | .fn ()
43 | .mockRejectedValueOnce (new Error ('Async error'))
我认为在 JEST 的设置中关于这个错误是可以管理的。但是,从根本上说,我不知道如何在 JEST 中测试 Promise 递归处理。
【问题讨论】:
标签: javascript typescript jestjs