Модификация запросов и ответов

Cypress предоставляет мощные возможности для перехвата и модификации HTTP-запросов и ответов, что позволяет контролировать взаимодействие тестируемого приложения с сервером. Основные инструменты для этого — команды cy.intercept() и цепочки .as() для последующей работы с алиасами.


Перехват запросов с помощью cy.intercept()

Команда cy.intercept() позволяет перехватывать сетевые запросы, фильтруя их по URL, HTTP-методу или регулярному выражению. Базовый синтаксис:

cy.intercept(method, url, routeHandler)
  • method — HTTP-метод запроса (GET, POST, PUT, DELETE и т.д.).
  • url — строка, маска или регулярное выражение для определения целевого запроса.
  • routeHandler — функция или объект, определяющий, что делать с запросом (например, модифицировать тело, статус или задержку).

Пример перехвата GET-запроса:

cy.intercept('GET', '/api/users', (req) => {
  req.reply({
    statusCode: 200,
    body: [{ id: 1, name: 'Иван' }, { id: 2, name: 'Мария' }],
  })
}).as('getUsers')

Здесь создаётся перехват запроса к /api/users с возвратом кастомного ответа.


Модификация запроса до отправки

Cypress позволяет изменять данные запроса перед его отправкой на сервер. Это удобно для тестирования различных сценариев без изменения серверной логики.

cy.intercept('POST', '/api/login', (req) => {
  req.body.username = 'тестовый_пользователь';
  req.body.password = '123456';
}).as('login')
  • req.body — тело запроса.
  • req.headers — заголовки запроса.
  • req.url — возможность динамически менять URL перед отправкой.

Модификация ответа сервера

Ответ сервера можно изменить через объект req.reply(). Это позволяет создавать mock-данные для тестирования граничных случаев или ошибок сервера.

cy.intercept('GET', '/api/products', (req) => {
  req.reply((res) => {
    res.send({
      statusCode: 500,
      body: { error: 'Внутренняя ошибка сервера' },
    })
  })
}).as('getProductsError')

Возможности res для модификации:

  • res.statusCode — изменение HTTP-кода ответа.
  • res.body — изменение тела ответа.
  • res.headers — модификация заголовков.
  • res.delay — добавление задержки для симуляции медленного соединения.

Подмена данных с задержкой

Добавление искусственной задержки помогает тестировать поведение приложения при медленных сетевых соединениях:

cy.intercept('GET', '/api/orders', (req) => {
  req.reply((res) => {
    res.delay = 2000 // задержка 2 секунды
    res.send({ orders: [] })
  })
}).as('getOrdersDelayed')

Это полезно для проверки загрузочных индикаторов или таймаутов.


Работа с алиасами и ожидания

Созданные через .as() алиасы позволяют удобно синхронизировать тесты с сетевыми операциями:

cy.wait('@getUsers').then((interception) => {
  expect(interception.response.statusCode).to.eq(200)
  expect(interception.response.body).to.have.length(2)
})
  • interception.request — исходный запрос.
  • interception.response — полученный или модифицированный ответ.

Использование .wait() гарантирует, что тест продолжится только после завершения нужного запроса.


Множественные перехваты и фильтры

Cypress поддерживает множественные перехваты для одного URL с разными условиями:

cy.intercept({ method: 'GET', url: '/api/users', query: { role: 'admin' } }, { body: [] }).as('getAdmins')
cy.intercept({ method: 'GET', url: '/api/users', query: { role: 'user' } }, { body: [{ id: 1, name: 'Пользователь' }] }).as('getUsers')

Использование объекта с фильтром по query-параметрам или заголовкам позволяет точно управлять тестируемыми сценариями.


Инъекция ошибок и тестирование отказоустойчивости

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

cy.intercept('GET', '/api/data', {
  forceNetworkError: true
}).as('networkError')

Также можно возвращать статус-коды ошибок:

cy.intercept('POST', '/api/submit', {
  statusCode: 400,
  body: { message: 'Неверные данные' }
}).as('badRequest')

Это позволяет протестировать обработку ошибок и вывод сообщений пользователю.


Логирование и отладка запросов

Для анализа сетевых запросов можно использовать консольное логирование:

cy.intercept('GET', '/api/users', (req) => {
  console.log('Запрос:', req)
  req.reply((res) => {
    console.log('Ответ:', res)
    res.send(res.body)
  })
})

Логирование помогает отследить, какие данные реально отправляются и возвращаются, а также проверить корректность модификаций.


Практические рекомендации

  • Использовать cy.intercept() вместо старого cy.route(), так как он поддерживает новые возможности и асинхронные модификации.
  • Для повторного использования mock-данных выносить их в отдельные JSON-файлы или fixtures.
  • Всегда проверять результат модификации через cy.wait() и assert, чтобы избежать ошибок синхронизации.
  • Симуляция ошибок и задержек помогает создавать более устойчивые тесты к реальной сетевой среде.

Модификация запросов и ответов в Cypress предоставляет полный контроль над сетевым взаимодействием, позволяя создавать сложные и надежные тестовые сценарии без изменения серверной логики.