#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
})
})