Запрос подтверждения не произошел - PullRequest
0 голосов
/ 23 сентября 2019

У меня есть следующий тест

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 Ответ

1 голос
/ 23 сентября 2019

Хорошо, чтобы добиться этого, я использовал следующее:

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 независимо от того, что вызвало

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...