В автоматизированном тестировании веб-приложений важную роль играет контроль над сетевыми запросами. Cypress предоставляет мощные инструменты для работы с моками и стабами, что позволяет тестировать приложение изолированно, без зависимости от реального бэкенда.
В Cypress основная работа ведётся со стабами, которые могут использоваться для имитации ответов сервера.
Cypress использует команду cy.intercept() для перехвата
HTTP-запросов. Она заменяет устаревший cy.route() и
предоставляет гибкий способ контроля над запросами.
Пример базового стаба GET-запроса:
cy.intercept('GET', '/api/users', {
statusCode: 200,
body: [
{ id: 1, name: 'Иван' },
{ id: 2, name: 'Мария' }
]
}).as('getUsers');
cy.visit('/users');
cy.wait('@getUsers');
Ключевые моменты:
as() задаёт алиас, который упрощает ожидание запроса
через cy.wait().Моки полезны не только для GET. Любой тип запроса можно подменить.
cy.intercept('POST', '/api/users', (req) => {
req.reply({
statusCode: 201,
body: { id: 3, name: req.body.name }
});
}).as('createUser');
cy.get('form').submit();
cy.wait('@createUser');
Особенности:
req.body позволяет использовать данные из запроса для
формирования ответа.Cypress позволяет создавать более реалистичные ответы, добавляя задержки или изменяя содержимое на основе входных данных:
cy.intercept('GET', '/api/orders', (req) => {
req.reply((res) => {
res.delay(500); // имитация сетевой задержки
res.send({
statusCode: 200,
body: [{ id: 101, total: 250 }]
});
});
}).as('getOrders');
res.delay() полезен для тестирования загрузочных
индикаторов.res.send() позволяет полностью контролировать статус,
заголовки и тело ответа.Используя стабы, можно проверять, как приложение взаимодействует с API:
cy.intercept('PUT', '/api/users/*').as('updateUser');
cy.get('input[name="name"]').clear().type('Алексей');
cy.get('button.save').click();
cy.wait('@updateUser').its('request.body').should('deep.equal', {
name: 'Алексей'
});
its('request.body') позволяет проверить тело
запроса.request.headers)
и URL-параметры (request.url).Можно настроить разные ответы на повторяющиеся запросы, что полезно при тестировании пагинации или шагов с прогрессом:
cy.intercept('GET', '/api/messages', [
{ id: 1, text: 'Привет' },
{ id: 2, text: 'Как дела?' }
]).as('firstFetch');
cy.intercept('GET', '/api/messages', [
{ id: 3, text: 'Новое сообщение' }
]).as('secondFetch');
Cypress поддерживает работу с файлами фикстур. Это удобно для больших объёмов тестовых данных:
cy.fixture('users.json').then((users) => {
cy.intercept('GET', '/api/users', users).as('getUsers');
});
users.json хранится в папке
cypress/fixtures.cy.wait() и проверки
последовательности запросов.Моки и стабы в Cypress позволяют создавать надёжные, повторяемые и быстрые тесты, обеспечивая полный контроль над HTTP-взаимодействием, проверку данных и моделирование сетевых условий.