Проверьте, сколько раз был сделан запрос

#cypress

Вопрос:

Используя Cypress Intercept, чтобы имитировать маршруты, и я хочу проверить, сколько раз вызывался маршрут. До сих пор я ничего не нашел в документах для этого. Там упоминается cy.spy , но каждый раз он возвращает только 1. {times:N} Для перехваченного маршрута есть объект, но он позволяет маршруту совпадать и выполняться любое количество раз. Это не действует как ограничение по вызову. Это такая распространенная потребность, что я уверен, что мне просто чего-то не хватает, усталых глаз и всего остального.

Шпион:

 cy.intercept({method: 'GET', url:'my-url', middleware:cy.spy().as('myspy')})
 

Раз:

  cy.intercept({method: 'GET', url:'my-url'}, {times:0})
 

Запрос функции Cypress: https://github.com/cypress-io/cypress/issues/16655

Ответ №1:

Работает следующая команда.

Обратите внимание, что cy.get это не работает с ведущим @ , но мне кажется, что это более ожидаемо, так что это будет работать с ним или без него.

Добавьте это к /cypress/support/commands.js

 Cypress.Commands.add(`verifyCallCount`, (alias, expectedNumberOfCalls) => {
  const resolvedAlias = alias[0] === `@` ? alias.substring(1) : alias

  cy.get(`${resolvedAlias}.all`).then((calls) => {
    cy.wrap(calls.length).should(`equal`, expectedNumberOfCalls)
  })
})
 

Использование:

 cy.verifyCallCount(`@createLogEntry`, 3)
// Or
cy.verifyCallCount(`createLogEntry`, 3)
 

Ответ №2:

Я искал то же самое, потому что у нас есть демо-счета, которые не предназначены для доступа/вызова наших API. Проведя некоторые исследования, вот что в итоге сработало на меня:

 describe('demo accounts', () => {
  beforeEach(function spyOnApiCalls() {
    cy.intercept(/payment-platform/, cy.spy().as('coreApi'))
    cy.intercept(/service-management/, cy.spy().as('mgmtApi'))
  })

  afterEach(function assertApisWereNotCalled() {
    cy.get('@coreApi').its('callCount').should('equal', 0)
    cy.get('@mgmtApi').its('callCount').should('equal', 0)
  })

  it('start test blocks', () => {...})
})
 

Обратите внимание , как мы передаем и сглаживаем экземпляры cy.spy , а затем утверждаем против них. ИМО, это также довольно хорошо читается с its('callCount').should('equal', expectedCallCount) помощью .

Здесь у нас есть beforeEach и afterEach блоки, потому что в моем случае это имело смысл, но этот подход кажется довольно гибким и должен работать во многих других сценариях.

Ответ №3:

Перехват кипариса-это шпион.

Проблема в том, когда проверить количество вызовов.

Например, http://cypress.io/page-data

 it('counts intercepts', () => {

  let requestCounter = 0;
  let responseCounter = 0;

  cy.intercept('page-data/**/*', (req) => {
    requestCounter  = 1;                            // count requests
    req.on('response', () => requestCounter  = 1 )  // or count responses
  })

  cy.visit('https://www.cypress.io/')

  cy.wait(5000).then(() => {               // arbitrary wait
    expect(requestCounter).to.eq(18)       // since we don't know exactly
    expect(responseCounter).to.eq(18)      // what loads last
  })                                       

})
 

Ответ, данный Дженнифер Шехейн в запросе связанной функции, показывает другой способ использования <alias>.all ,

 it('counts intercepts', () => {

  cy.intercept('page-data/**/*')
    .as('pageData')

  cy.visit('https://www.cypress.io/')

  cy.get('@pageData.all')
    .should('have.length', 18);

})
 

Однако это не проходит последовательно. Примерно 1 из 5 запусков на моей машине завершается неудачно, потому что cy.get() реагирует слишком рано.

В идеале вы должны иметь возможность добавить тайм-аут, но в настоящее время это не имеет никакого эффекта.

 cy.get('@pageData.all', { timeout: 10000 })  // does not observe the timeout
 

Использование cy.spy() в качестве обработчика маршрутов позволяет установить тайм-аут для кода, который проверяет количество вызовов.

 it('counts intercepts', () => {

  cy.intercept({ url: 'page-data/**/*', middleware: true }, req => {
    req.on('response', (res) => {
      res.setDelay(2000)               // artificial delay to force failure
    })
  })

  const spy = cy.spy();
  cy.intercept('page-data/**/*', spy)

  cy.visit('https://www.cypress.io/')

  cy.wrap({}, { timeout: 10000 })     // adjust timeout to suit worst case page load
    .should(() => {
      console.log('testing spy')      // see the retry happening (90  logs)
      expect(spy).to.be.callCount(18)
    })

})
 

Ответ №4:

Я обнаружил, что эта проблема является редкой причиной для использования локальной переменной в Cypress:

 it('Counts intercepts', () => {

    let count = 0

    cy.intercept('GET','/route', req => {
        count = count 1;
        req.reply({})
    })

    //... your tests
    
    cy.get('body').then( () => {
        expect(count,'Number of times intercepted').to.equal(1) //Assert intercepted only once
    })
})