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

时间:2017-11-14 21:13:23

标签: cypress

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

我想断言,当" Save"时,会添加一个新的foo。点击按钮,但是当"取消"单击按钮。

这样的事情:

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

我尝试使用执行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.');
});

......这似乎有效,但它确实感觉不到" cypress-y"。

2 个答案:

答案 0 :(得分:5)

您可以重新别名route并将其onRequest的行为更改为throw; 但是通常,断言事情没有发生更糟糕,因为它们是不确定的。 继续操作之前,您应该等待多长时间?

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

具有这样的断言只会给测试增加不必要的时间。这种测试称为Conditional Testing as mentioned in the Cypress Docs

答案 1 :(得分:0)

我认为您可以比较 cy.state('routes') 中的数据并检查状态。

let routes = cy.state('routes');
// check each URL and if it has "/foos" in it, add it to an array to test
// this step is just an example, there are plenty of different ways to approach this
let foosRoutes = [];
for (let route in routes) {
  for (let req in routes[route].requests) {
    let reqUrl = routes[route].requests[req].request.url;
    // test each URL for "/foos" and if it has it, add the URL to the array
    if((/\/foos/).test(reqUrl)) {
      fooRoutes.push(reqUrl);
    }
  }
};
expect(foosRoutes).to.have.property("length", 0);

或者,如果您以不同的方式挖掘 cy.state('routes'),也许您可​​以通过 aliaspostFoo 进行过滤,然后确保其 requests 为空或计数你期待。