【发布时间】:2020-05-11 00:53:14
【问题描述】:
背景
我使用 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 开发网络选项卡上,第一次发出的请求由于太慢而被取消,如下所示。
问题:
我使用 /file/converter/comm/session/info(我们称之为端点 1)来获取一些与用户相关的数据。此请求已分派到所有 3 个后端服务器。如果一个解决了,那么剩下的 2 个请求将被取消,即它们将返回 null。
在我的赛普拉斯 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$ 取消的请求,这有时会失败,因为它不是成功的请求。下图显示了 3 个使用 getSessionInfo 别名的请求是如何成功的,但是测试失败,因为第一个请求失败。
在 Cypress 中,我如何等待成功,即 status = 200 请求?
【问题讨论】:
标签: cypress e2e-testing