如何断言Cypress 自定义命令失败?假设我有一个带有一组复杂测试的自定义命令,这些测试可能由于未找到某些元素而失败,我可以断言测试文件中该行的失败吗?
e2e/test.cy.ts:
cy.someComplexCommand().should('fail')
支持/命令.ts:
Cypress.Commands.add('someComplexCommand', () => {
/* Some detailed DOM-traversing test */
})
上面显然是 sudo 代码。这样做的用例是,我有一个复杂的命令,可以根据其文本内容在表中搜索特定行。虽然我大部分时间都使用它来断言表中存在某些内容,但有一些测试需要断言它不存在(就像我刚刚删除 UI 中的表行时一样)。我不想在测试主体中编写另一个命令或更多代码,而是更愿意保持干燥并重新使用现有命令,断言失败。这可能吗?
我已经搜索过了,似乎没有太多关于在 Cypress 中断言失败的细节。
支持/命令.ts:
Cypress.Commands.add('getTableRowContainingText', (text: string): Cypress.Chainable<JQuery<HTMLElement>> => {
return cy.get('table')
.first()
.find('tbody > tr > td')
.filter(`:contains(${text})`)
.first()
.parent('tr')
})
e2e/test.cy.ts:
cy.getTableRowContainingText('not-there').should('not.exist')
上述测试失败,因为当表为空时,我的 UI 根本不显示表:
.should('not.exist')
仅适用于紧邻其前面的查询。
如果您注释掉除
cy.get('table')
之外的所有内容,它就会通过(如果是缺少的表)。
您创建的是命令而不是查询,这就是为什么当
.should('not.exist')
不存在时,<table>
没有达到预期的传递效果。
从技术上讲,您应该将其定义为自定义查询
Cypress.Commands.addQuery('getTableRowContainingText', (text) => {
return (subject) => {
return Cypress.$('table')
.first()
.find('tbody > tr > td')
.filter(`:contains(${text})`)
.first()
.parent('tr')
}
})
cy.getTableRowContainingText('not-there').should('not.exist') // ✅ passes
该模式是返回一个同步函数(无
cy.get()
),运行程序将重复调用该函数,直到发生超时。
内部返回
return Cypress.$('table')...
的结果应用于断言.should('not.exist')
,如果一致则通过。
请注意,否定断言不要等待完全超时。如果该表在几秒钟后出现,则断言仍然通过,因为该表最初不存在。