我有以下测试
it('does not trigger request', () => {
cy.shortcutThatTriggersRequest()
cy.route({
method: 'POST',
url: '[url]',
onRequest: () => {
cy.contains('request was invoked').should('exist')
},
})
cy.wait(1000)
})
这是我想做的-如果给定的请求发生了,它将使测试失败,如果没有,则测试将通过。
尽管有两个麻烦的事情:
Cypress detected that you returned a promise from a command while also invoking one or more cy commands in that promise.
;我不能省略wait
,否则测试将被标记为通过(测试在解决请求时结束,测试被标记为通过且失败随后发生);仅当发出请求时才会发生这种情况(这很有意义,因为未触发route
,所以contains
不能在与wait
的同一时刻触发)cy.contains('request was invoked').should('exist')
将测试标记为失败。我不想那样做;尽管永远不会有这样的字符串,但这是一种解决方法;理想情况下,我想配合cy.fail()
,但我看不到这种方法答案 0 :(得分:1)
好吧,要实现这一点,我使用了以下内容:
it.skip('does not trigger products requests', () => {
Cypress.on('fail', (error, runnable) => {
if (error.message.indexOf('Timed out retrying') !== 0) throw error
})
cy.server()
cy.route({
method: 'POST',
url: '[url]',
}).as('products')
cy.shortcutThatTriggersRequest()
cy.wait('@products', {
requestTimeout: 1000,
}).then((xhr) => {
assert.isNull(xhr.response.body)
})
})
如果超时,它将在fail
内处理,因此测试将通过。如果它进入then
,则测试将失败。
这里还有一个问题,如果检查了多个路由(cy.wait['route1', 'route2']
)并且其中一个不存在,那么即使其中一个断言指定了不应该,测试也将通过例如:
it.skip('does not trigger products requests', () => {
Cypress.on('fail', (error, runnable) => {
if (error.message.indexOf('Timed out retrying') !== 0) throw error
})
cy.server()
cy.route({
method: 'POST',
url: '[url]',
}).as('route1')
cy.route({
method: 'POST',
url: '[url]',
}).as('route2')
cy.shortcutThatTriggersRequest()
cy.wait(['@route1', '@route2'], {
requestTimeout: 1000,
}).then((xhrs) => {
assert.isNull(xhrs[0].response.body)
assert.isNull(xhrs[1].response.body)
})
})
即使有对其中一个端点的请求,仍然通过(我认为这是由处理onfail
引起的错误。需要做的是,请求断言必须是顺序的:
cy.wait('@route1', {
requestTimeout: 1000,
}).then((xhr) => {
assert.isNull(xhr.response.body)
})
cy.wait('@route2', {
requestTimeout: 1000,
}).then((xhr) => {
assert.isNull(xhr.response.body)
})
据我所知,我们无法检查error
中onfail
的类型,因为不管它是什么原因,它始终是CypressError