Cypress.io - 断言没有XHR请求到URL?

Bri*_*oer 13 cypress

使用cypress.io进行测试时,有没有一种方法可以断言没有对给定的URL发出XHR请求?

我想声明在单击"保存"按钮时添加了新的foo,但是在单击"取消"按钮时则没有.

像这样的东西:

cy.route('POST', '/foos').as('postFoo');
cy.get('.cancel-button').click();
cy.route('@postFoo').should('not.have.been.called'); // (magic imaginary syntax!)
Run Code Online (Sandbox Code Playgroud)

我已经尝试使用执行assert.fail的onRequest回调设置cy.route,但是当调用URL时,这并没有使测试失败.

现在,我正在捕捉我的(故意)"没有请求发生"错误,如下所示:

cy.on('fail', (err, runnable) => {
  expect(err.message).to.include('No request ever occurred.');
  return false;
});  

cy.wait('@postFoo', { timeout: 0 }).then(xhr => {
  throw new Error('Unexpected API call.');
});
Run Code Online (Sandbox Code Playgroud)

...这似乎有效,但它肯定不会感到非常"cypress-y".

bku*_*era 6

您可以重新别名route并更改其onRequest行为以进行抛出; 然而,断言事情没有发生通常更糟,因为它们是非确定性的.在继续之前,您应该等待多长时间才能发现错误?:

cy.route({
  method: 'POST',
  url: '/foos',
  onRequest: () => {
    throw new Error('Whoops')
  }
})
cy.get('.cancel-button').click();
cy.wait(1000)  // give it one second to throw, then move on
Run Code Online (Sandbox Code Playgroud)

这样的断言只会给你的测试增加不必要的时间.这种类型的测试称为赛普拉斯文档中提到的条件测试

  • “......断言事情没有发生通常更糟糕” - 我们通过使用`cy.get`而不是`cy.wait`来观察单击取消按钮后发生的DOM更改来解决这个问题我们知道没有调用路由就执行了操作。 (2认同)