Cypress изначально ориентирован на тестирование веб-приложений через HTTP-запросы, однако современные приложения активно используют WebSocket для двусторонней коммуникации в реальном времени. Для полноценного тестирования необходимо уметь мокать WebSocket-соединения, контролировать входящие и исходящие сообщения и проверять реакцию интерфейса на события сервера.
WebSocket предоставляет постоянное соединение между клиентом и сервером, что отличается от привычного запроса-ответа HTTP. Мокирование WebSocket в Cypress включает несколько ключевых аспектов:
WebSocket. Вместо реального соединения
используется объект-заменитель, который имитирует поведение
сервера.open,
message, close, error. Они должны
быть корректно вызваны мок-объектом для проверки реакций
приложения.Для замены реального WebSocket в Cypress используется глобальная
переопределение через cy.visit с опцией
onBeforeLoad. Пример:
cy.visit('/app', {
onBeforeLoad(win) {
class MockWebSocket {
constructor(url) {
this.url = url;
this.readyState = 1; // открытое соединение
this.sentMessages = [];
setTimeout(() => this.onopen && this.onopen(), 0);
}
send(message) {
this.sentMessages.push(message);
// Автоматический ответ сервера
setTimeout(() => {
if (this.onmessage) {
this.onmessage({ data: `Echo: ${message}` });
}
}, 10);
}
close() {
this.readyState = 3;
if (this.onclose) this.onclose();
}
}
win.WebSocket = MockWebSocket;
}
});
Ключевые моменты:
readyState позволяет имитировать состояние
соединения.sentMessages хранит все сообщения, отправленные
клиентом, что облегчает проверку тестов.send и close вызывают
соответствующие события onmessage и onclose,
имитируя поведение настоящего WebSocket.После подмены WebSocket можно писать тесты, проверяющие корректность работы интерфейса с реальным потоком сообщений:
it('Отправка и получение сообщений через WebSocket', () => {
cy.get('#sendButton').click();
cy.get('#messageInput').type('Hello{enter}');
cy.window().then(win => {
const ws = win.WebSocket.instances[0];
expect(ws.sentMessages).to.include('Hello');
});
cy.get('#chatBox').should('contain.text', 'Echo: Hello');
});
Особенности подхода:
win.WebSocket.instances позволяет тесту обращаться к
конкретному соединению.message необходимо учитывать при
проверках интерфейса, используя Cypress команды ожидания
(should, then).Для проверки устойчивости приложения важно уметь инициировать ошибки и закрытия соединения:
cy.window().then(win => {
const ws = win.WebSocket.instances[0];
ws.onerror && ws.onerror(new Event('error'));
ws.onclose && ws.onclose({ code: 1006, reason: 'Server closed' });
});
cy.get('#status').should('contain.text', 'Disconnected');
onerror позволяет проверить обработку исключений.onclose с кодом и причиной помогает тестировать
восстановление соединения и уведомления пользователя.Мок WebSocket может быть интегрирован с другими Cypress инструментами:
cy.intercept для REST-запросов. Иногда
необходимо одновременно мокировать HTTP и WebSocket.cy.get,
cy.contains, cy.wait) для проверки реакции UI
на события WebSocket.MockWebSocket для
переиспользования в разных тестах.onBeforeLoad,
чтобы все соединения были перехвачены.Использование моков WebSocket в Cypress позволяет писать детальные, контролируемые и повторяемые тесты для приложений с реальным временем взаимодействия. Такой подход обеспечивает высокое покрытие тестами функционала, связанного с обменом данными в реальном времени, и помогает выявлять ошибки, которые не проявляются при простом тестировании через HTTP.