如何在柏树测试中等待成功响应 [英] How to wait for a successful response in Cypress tests

查看:0
本文介绍了如何在柏树测试中等待成功响应的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

背景

我使用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();

注意:如果一个请求的解析速度比其他请求快,通常情况下,racerxjs函数会取消其他两个请求。在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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆