断言请求没有发生

时间:2019-09-23 11:24:00

标签: cypress

我有以下测试

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(),但我看不到这种方法

1 个答案:

答案 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)
})

据我所知,我们无法检查erroronfail的类型,因为不管它是什么原因,它始终是CypressError