【问题标题】:Allow cy.wait to fail允许 cy.wait 失败
【发布时间】:2019-12-04 08:16:08
【问题描述】:

在阅读了很多文档并尝试找到解决我的问题的方法后,我没有找到任何东西,所以我们开始吧。

我在测试端到端流程时遇到以下问题,我正在测试的流程确实会持续启动请求,但在一种情况下,我希望这些请求会停止。换句话说,如果发出请求,我想抛出一个错误,并在没有任何请求的情况下达到超时时继续出错。

cy.wait('@my-request', { timeout: 20000 })

如果应用程序运行良好,我希望这会超时,所以我尝试这样做。

cy.wait('@my-request', { timeout: 20000 })
    .its('status').should('not.eq', 404)
    .its('status').should('not.eq', 200);

我希望执行链接的任务,但这仅在发出请求时发生,并且尝试使用 .then 但我遇到了同样的问题。

【问题讨论】:

  • 不确定您要做什么,但 cy.wait() 只接受路由的别名,而且您似乎正在尝试为请求做些什么?
  • 在流程中的某一时刻,应用程序应停止池化 API,我想对此进行测试,如果调用此端点的任何新事件,则测试失败。
  • 好的,我猜您正在尝试进行请求轮询,请参阅该链接docs.cypress.io/api/commands/request.html#Request-Polling
  • 请求不符合我的要求。我找到了ci.on('fail') 的解决方法
  • 不错!,请在下面标记您的 cmets 作为答案,它将对社区有所帮助:)

标签: cypress end-to-end


【解决方案1】:

添加一个全局失败事件可以帮助我们,但也限制了在此测试失败时不执行其他代码,我们强制将其标记为已完成。

在测试定义中,我们可以像示例中一样添加完成回调。

it('Description', (done) => {
// other test stuff
cy.on('fail', (err) => {
    if (err.name === 'CypressError' && err.message.includes('routeAlias') && err.message.includes('Timed out')) {
        done();
        return true;
    }
    throw err;
});
cy.wait('@routeAlias', { timeout: 20000 })
    .then(() => {
        throw new Error('Error request found.');
    });
});
// Any remaining code won't be executed if you need to reset something you need to create a new step, like in my case I did a new step to click a cancel button and prepare the app for the next test.

现在,当捕获到这个特定错误时,我们的测试通过了,但任何其他错误都会导致测试错误。

cypress 不推荐这种解决方法,但除非 cypress 添加一个 catch 来管理一些错误,否则这是解决我的问题的唯一方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多