是否可以在赛普拉斯自定义命令中断言失败?

问题描述 投票:0回答:1

如何断言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 根本不显示表:

javascript cypress
1个回答
0
投票

.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')
,如果一致则通过。

请注意,否定断言不要等待完全超时。如果该表在几秒钟后出现,则断言仍然通过,因为该表最初不存在。

© www.soinside.com 2019 - 2024. All rights reserved.