繁体   English   中英

如何使用 testcafe 测试对 API 调用的重试

[英]How to test retries to an API call using testcafe

我正在使用 Testcafe 进行集成测试,并且我想测试我的应用程序在收到错误后重试 API 调用的场景。 我正在使用 async-retry 库来拨打电话。 Retry是我创建的用于包装 API 调用的实用程序,因此我可以包装样板代码以调用 async-retry:

 const response = await Retry( () => { return fetch( buildUrl(env, csrf, '/api/myCustomCall', queryParams), options ); }, 'getRecommendations', { onRetry: () => { console.log('RETRYING'); } } );

对于后代,这是Retry实用程序:

 import retry, { AsyncRetryOptions } from 'async-retry'; export const Retry = ( func: () => Promise<any>, name: string, opts: AsyncRetryOptions = {} ): Promise<any> => { const retryOptions = { retries: opts.retries || 3, factor: opts.factor || 2, minTimeout: opts.minTimeout || 3000, maxTimeout: opts.maxTimeout || Infinity, randomize: opts.randomize || true, onRetry: (error: Error, attempt: number) => { console.error( `${new Date().toString()} - ${name} failed ${attempt} times, trying again` ); } }; return retry(func, retryOptions); };

这是我的测试:

 test.requestHooks( RequestMock() .onRequestTo(/myCustomCall/) .respond({ error: 'Bad value for request parameter' }, 400, responseHeaders) )('Recommendation request retries 3 times', async (t) => { await playgroundInit(t); await t.expect(recommendationLogger.requests.length).eql(4); });

playgroundInit是一个实用函数,它可以执行诸如登录和导航到我正在测试的页面之类的操作。 我在开发的时候,为了测试重试,使用了 Chrome devtools 来阻止 API 请求,成功了。 我看到重试工作。 但是,我想在我的测试中模仿这一点来自动化这种行为。 您如何在 testcafe 中模拟请求以触发重试?

据我了解,您是从 TestCafe 测试代码而不是从测试页面进行 API 调用。

在这种情况下,将不应用 RequestMock 机制。 RequestMock 使用从网站页面进行的 API 调用。 在您的情况下,您自己发起请求,因此 TestCafe 代理不会处理它。

如果您希望 RequestMock 工作,您可以尝试从浏览器而不是测试端进行 API 调用。 为此,您可以使用允许您将 JS 代码注入网站页面的 ClientFunction 机制。

从 TestCafe 1.20.0 开始,您可以使用专用的t.request方法在测试中发送请求 发送此类请求将触发您在测试中设置的请求挂钩(如果这些请求满足请求挂钩的参数)。 您可以在指南中了解有关 TestCafe API 测试的更多信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM