如何在柏树测试中等待成功响应 [英] How to wait for a successful response in Cypress tests
本文介绍了如何在柏树测试中等待成功响应的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
背景
我使用3个后端服务器为我的一个在线SaaS应用程序提供容错。所有重要的API调用(如获取用户数据)都会与所有3台服务器联系,并使用第一个成功解析的响应的值(如果有)。
export function getSuccessValueOrThrow$<T>(
observables$: Observable<T>[],
tryUntilMillies = 30000,
): Observable<T> {
return race(
...observables$.map(observable$ => {
return observable$.pipe(
timeout(tryUntilMillies),
catchError(err => {
return of(err).pipe(delay(5000), mergeMap(_err => throwError(_err)));
}),
);
})
);
}
按如下方式调用getSuccessValueOrThrow$:
const shuffledApiDomainList = ['server1-domain', 'server2-domain', 'server3-domain';
const sessionInfo = await RequestUtils.getSuccessValueOrThrow(
...(shuffledApiDomainList.map(shuffledDomain => this.http.get<SessionDetails>(`${shuffledDomain}/file/converter/comm/session/info`))),
).toPromise();
注意:如果一个请求的解析速度比其他请求快,通常情况下,race
rxjs函数会取消其他两个请求。在Chrome dev网络选项卡上,发送的第一个请求由于速度太慢而被取消,看起来就像下面这样。
问题:
我使用/file/converter/comm/session/info(让我们称之为EndPoint1)来获取一些与用户相关的数据。该请求被分派到所有3个后端服务器。如果一个解析,则剩余的2个请求将被取消,即它们将返回NULL。
在我的Cypress E2E测试中
cy.route('GET', '/file/converter/comm/session/info').as('getSessionInfo');
cy.visit('https://www.ps2pdf.com/compress-mp4');
cy.wait('@getSessionInfo').its('status').should('eq', 200)
如果以来getSessionInfo别名挂接到的请求最终被getSuccessValueOrThrow$
取消,因为该请求不是成功的请求,则此操作有时会失败。下图显示了使用getSessionInfo别名的3个请求中有1个请求成功,但由于第一个请求失败,测试失败。
在Cypress中,如何等待成功的请求,即Status=200?
推荐答案
我是这样等待的:
const isOk = cy.wait("@getSessionInfo").then((xhr) => {
return (xhr.status === 200);
});
这篇关于如何在柏树测试中等待成功响应的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文