cy.intercept() — мощный инструмент для перехвата
HTTP-запросов и управления ими в тестах. Он позволяет контролировать
поведение сети: подменять ответы, проверять отправленные данные,
задерживать или блокировать запросы. Использование
cy.intercept() значительно повышает надёжность тестов,
делая их независимыми от внешних сервисов.
cy.intercept([method], url, [response])
GET, POST, PUT,
DELETE и др.). Если не указан, перехватываются все
методы.Пример перехвата GET-запроса:
cy.intercept('GET', '/api/users', { fixture: 'users.json' }).as('getUsers');
Здесь все запросы к /api/users будут возвращать
локальный fixture users.json, а alias
@getUsers позволяет ссылаться на перехваченный запрос в
дальнейшем.
Использование alias позволяет легко проверять, что запрос был выполнен и корректно обработан:
cy.wait('@getUsers').its('response.statusCode').should('eq', 200);
cy.wait() ожидает выполнения перехваченного
запроса.its('response.statusCode') позволяет проверить
HTTP-статус ответа.cy.intercept() поддерживает функцию обратного вызова для
динамической подмены ответа:
cy.intercept('POST', '/api/login', (req) => {
if (req.body.username === 'admin') {
req.reply({ statusCode: 200, body: { token: 'fake-token' } });
} else {
req.reply({ statusCode: 401, body: { error: 'Unauthorized' } });
}
}).as('loginRequest');
req содержит информацию о запросе: тело, заголовки,
параметры.req.reply() позволяет изменить статус, тело и заголовки
ответа.Можно использовать регулярные выражения или шаблоны URL для перехвата множества запросов:
cy.intercept('GET', /\/api\/.*/).as('allApiCalls');
Все GET-запросы, начинающиеся с /api/, будут перехвачены
и доступны через alias @allApiCalls.
cy.intercept() позволяет проверять содержимое
запроса:
cy.intercept('POST', '/api/orders').as('createOrder');
cy.get('form').submit();
cy.wait('@createOrder').then((interception) => {
expect(interception.request.body).to.have.property('productId', 123);
});
interception.request.body содержит тело отправленного
запроса.Для тестирования обработки ошибок или медленных соединений можно подменять статус и добавлять задержку:
cy.intercept('GET', '/api/users', {
statusCode: 500,
body: { error: 'Server error' },
delayMs: 2000
}).as('getUsersError');
statusCode изменяет HTTP-статус.body задаёт тело ответа.delayMs эмулирует задержку сети.fixture для тестовых данныхFixtures позволяют хранить тестовые данные в отдельных файлах и возвращать их при перехвате запросов:
cy.intercept('GET', '/api/products', { fixture: 'products.json' }).as('getProducts');
cypress/fixtures/products.json содержит
JSON-массив с продуктами.Можно фильтровать запросы по дополнительным условиям:
cy.intercept({
method: 'GET',
url: '/api/users',
headers: { 'x-custom-header': 'test' },
query: { role: 'admin' }
}, { fixture: 'admin-users.json' }).as('getAdminUsers');
cy.intercept() и UI-тестированияЗагрузка данных при рендере страницы:
fixture.Формы и отправка данных:
Обработка ошибок и таймаутов:
delayMs и статусом ошибки.cy.wait().fixture для статических тестовых данных,
это упрощает поддержку тестов.cy.intercept() с проверкой UI для
комплексного e2e-тестирования.cy.intercept() обеспечивает полный контроль над сетевыми
взаимодействиями, позволяя создавать стабильные, предсказуемые и быстрые
тесты, которые не зависят от состояния внешних сервисов.