【发布时间】:2019-11-28 09:27:32
【问题描述】:
目前,当 it() 块中的单个测试失败时,赛普拉斯会完全停止。
我希望赛普拉斯继续运行后续测试,无论之前的测试是否失败(但我仍然想标记失败的测试,以便知道哪个测试失败)。
我试图拦截beforeEach中的失败事件:
beforeEach(() => {
Cypress.on('fail', (error, runnable) => {
cy.log('this single test failed, but continue other tests');
// don't stop!
// throw error; // marks test as failed but also makes Cypress stop
});
但我似乎无法在此处理程序中使用任何 cy 命令,因为当我这样做时,由于赛普拉斯奇怪的内部承诺逻辑,它会返回错误:
CypressError:Cypress 检测到您从 命令,同时在该承诺中调用一个或多个 cy 命令。
返回承诺的命令是:
cy.wait()
你在 promise 中调用的 cy 命令是:
cy.log()
因为 Cypress 命令已经类似于 Promise,所以您不需要 包装它们或返回您自己的承诺。
赛普拉斯将使用最终的赛普拉斯解决您的命令 命令产生。
这是错误而不是警告的原因是因为赛普拉斯 在内部将命令串行排队,而 Promises 会尽快执行 当它们被调用时。试图调和这将阻止 赛普拉斯永远无法解决。
https://on.cypress.io/returning-promise-and-commands-in-another-command
如果我将 Cypress.on('fail') 块留空,所有测试都将被标记为通过,即使它们失败了。
如果我取消注释 throw error,赛普拉斯将在任何失败的测试中完全停止。
【问题讨论】:
-
您使用的是哪个版本?赛普拉斯不会提前失败(AFAIK 也从未失败过),所以你描述的这种行为很奇怪。你能分享一个可重现的回购吗?
标签: javascript cypress