Cypress предоставляет мощные возможности для перехвата и модификации
HTTP-запросов и ответов, что позволяет контролировать взаимодействие
тестируемого приложения с сервером. Основные инструменты для этого —
команды cy.intercept() и цепочки .as() для
последующей работы с алиасами.
cy.intercept()Команда cy.intercept() позволяет перехватывать сетевые
запросы, фильтруя их по URL, HTTP-методу или регулярному выражению.
Базовый синтаксис:
cy.intercept(method, url, routeHandler)
GET,
POST, PUT, DELETE и т.д.).Пример перехвата 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.reply().
Это позволяет создавать mock-данные для тестирования граничных случаев
или ошибок сервера.
cy.intercept('GET', '/api/products', (req) => {
req.reply((res) => {
res.send({
statusCode: 500,
body: { error: 'Внутренняя ошибка сервера' },
})
})
}).as('getProductsError')
Возможности res для модификации:
Добавление искусственной задержки помогает тестировать поведение приложения при медленных сетевых соединениях:
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(), так как он поддерживает новые возможности и
асинхронные модификации.cy.wait()
и assert, чтобы избежать ошибок синхронизации.Модификация запросов и ответов в Cypress предоставляет полный контроль над сетевым взаимодействием, позволяя создавать сложные и надежные тестовые сценарии без изменения серверной логики.