在 Cypress 中,如果我有一个触发异步操作的按钮(如
fetch
),并且我想验证单击此按钮是否不最终触发错误,这是否足够?
cy.findByTestId('the-button').click();
cy.findByTestId('error-msg').should('not.exist');
我怀疑不是。我想我需要使用
cy.wait
,通常带有路线,如下所示:
cy.intercept('POST', '/endpoint').as('endpoint');
cy.findByTestId('the-button').click();
cy.wait('@endpoint');
cy.findByTestId('error-msg').should('not.exist');
但这保证有效吗?如果端点响应,
should('not.exist')
测试通过,然后 - 因为页面需要一些时间来更新以回复端点的响应 - 发生错误怎么办?
这里有一些可以遵循的最佳实践吗?
后续问题:可以公平地说,积极和消极的主张之间存在严重的不对称吗?如果我理解正确的话,Cypress 会重试断言,直到它们通过。因此,有效地,
should
断言检查该断言在未来某个时间点是否为真。但是对于否定断言,我们经常想要检查的是该断言在“每个”未来时间点都是正确的。这让我认为负面的断言很容易产生误导。
超时会等待满足断言所需的时间。如果该元素最初存在,
因此,如果应用程序允许,请强制错误发生(在测试的安排部分期间),然后采取使其消失的操作(测试的行动部分)并断言它不存在。
对于使用
cy.wait('@endpoint')
单线程
,因此由
cy.get('the-button').click()
引起的操作应在 cy.wait('@endpoint')
执行之前完成。
如有疑问,进行燃烧测试 -
使用 cypress-grep 进行燃烧测试