【发布时间】:2020-12-02 10:52:05
【问题描述】:
尝试测试通过 fetch 重试 API 请求 5 次的指数退避方法,将有以下延迟:[1 ms, 10 ms, 100 ms, 1 s, 10 s],我无法成功测试它.
方法
export const delay = retryCount => new Promise(resolve => setTimeout(resolve, 10 ** retryCount));
/**
* Fetching with delay when api call fails,
* first 5 retries will have the following delays: [1 ms, 10 ms, 100 ms, 1 s, 10 s]
*/
export const fetchRetry = async (options, retryCount = 0, lastError = null) => {
if (retryCount > 5) throw new Error(lastError);
try {
return await fetch(options);
} catch (error) {
await delay(retryCount);
return fetchRetry(options, retryCount + 1, error);
}
};
测试
import fetchMock from 'jest-fetch-mock';
import { delay, fetchRetry } from './retry';
// This can be set up globally if needed
fetchMock.enableMocks();
beforeEach(() => {
fetch.resetMocks();
});
describe('fetchWithExponentialBackoffRetry', () => {
it('fetch is called once when response is 200', done => {
fetch.mockResponseOnce(
JSON.stringify({
success: true,
message: 'OK',
code: 200,
data: 'c86e795f-fe70-49be-a8fc-6876135ab109',
}),
);
setTimeout(function() {
fetchRetry({
inventory_type_id: 2,
advertiser_id: 2315,
file: null,
});
expect(fetch).toHaveBeenCalledTimes(1);
done();
}, 0);
});
it('fetch is called 5 times when response is returns failure', done => {
fetch.mockReject(() => Promise.reject(new Error('Rejected')));
setTimeout(function() {
fetchRetry({
inventory_type_id: 2,
advertiser_id: 2315,
file: null,
});
expect(fetch).toHaveBeenCalledTimes(5);
done();
}, 100000);
});
});
我收到以下错误
console.error node_modules/jsdom/lib/jsdom/virtual-console.js:29 错误:错误:连接 ECONNREFUSED 127.0.0.1:8
我认为它必须做我们delay 方法我必须在我的测试中以某种方式合并 setTimeout,现在确定如何在这里模拟它。我将不胜感激。
【问题讨论】:
-
你没有在第一次测试中等待
fetchRetry -
我更新了测试,jest sill 超时,我看到了上面提到的错误。我将此测试的超时时间增加到 10000,但仍然会在一段时间后超时
-
我进行了一些编辑并使用了 setTimeout,但测试仍然失败。不知道现在该怎么办
标签: javascript jestjs