使用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"。
答案 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')
,也许您可以通过 alias
的 postFoo
进行过滤,然后确保其 requests
为空或计数你期待。