сервер
Запустите сервер, чтобы начать маршрутизацию ответов для cy.route() и изменить поведение сетевых запросов.
⚠️
cy.server()иcy.route()устарели в Cypress 6.0.0. В будущей версии поддержкаcy.server()иcy.route()будет удалена. Вместо этого используйтеcy.intercept(). См. наше руководство по миграцииcy.route()кcy.intercept()
⚠️
cy.route()иcy.server()поддерживают только перехват XMLHttpRequests. Запросы, использующие Fetch API и другие типы сетевых запросов, такие как загрузки страниц и<script>теги, не будут перехваченыcy.route()иcy.server().Для поддержки запросов, использующих Fetch API, можно воспользоваться одним из следующих решений:
- Используйте
cy.intercept(), которое поддерживает запросы, использующие Fetch API и другие типы сетевых запросов, такие как загрузки страниц. См.cy.intercept().- Подключите
window.fetchдля отслеживания и подстановки запросов, использующихcy.route()иcy.server(), включивexperimentalFetchPolyfill. См. #95 для получения дополнительных сведений и временных решений.
Синтаксис
cy.server()
cy.server(options)
Использование
Правильное использование
cy.server()
Аргументы
options (Объект)
Передайте объект options, чтобы изменить поведение по умолчанию cy.server(). Эти параметры используются для двух целей:
- В качестве значений по умолчанию, которые объединяются с
cy.route(). - В качестве конфигурации поведения для всех запросов.
Следующие параметры объединяются в значения по умолчанию для cy.route()
| Параметр | Значение по умолчанию | Описание |
|---|---|---|
delay |
0 |
задержка для подставленных ответов (в мс) |
headers |
null |
заголовки ответа для подставленных маршрутов |
method |
"GET" |
метод для соответствия запросам |
onAbort |
undefined |
функция обратного вызова, которая срабатывает всякий раз, когда XHR прерывается |
onRequest |
undefined |
функция обратного вызова, когда отправляется запрос |
onResponse |
undefined |
функция обратного вызова, когда возвращается ответ |
response |
null |
тело ответа при подстановке маршрутов |
status |
200 |
код состояния ответа при подстановке маршрутов |
Следующие параметры управляют поведением сервера, влияя на все запросы
| Параметр | Значение по умолчанию | Описание |
|---|---|---|
enable |
true |
передача false для отключения существующих подставленных маршрутов |
force404 |
false |
вынужденная отправка XHR со статусом 404, когда XHR не соответствуют существующему маршруту |
onAnyAbort |
undefined |
функция обратного вызова, вызываемая при прерывании любого XHR |
onAnyRequest |
undefined |
функция обратного вызова, вызываемая при отправке любого запроса |
onAnyResponse |
undefined |
функция обратного вызова, вызываемая при возвращении любого ответа |
urlMatchingOptions |
{ matchBase: true } |
Значения по умолчанию, передаваемые в minimatch при использовании строк шаблонов для сопоставления URL-адресов |
ignore |
функция | Функция обратного вызова, которая фильтрует запросы, чтобы они не регистрировались или не подставлялись. По умолчанию это соответствует запросам, подобным активам, таким как .js, .jsx, .html, и .css файлы. |
Возвращаемое значение
-
cy.server()возвращаетnull. -
cy.server()нельзя цеплять далее.
Примеры
Без аргументов
После запуска сервера:
- Любой запрос, который НЕ соответствует
cy.route(), будет передан на сервер. - Любой запрос, который соответствует функции
options.ignore, НЕ будет регистрироваться или подставляться. - В журнале команд вы увидите запросы с именами
(XHR Stub)или(XHR).
cy.server()
Параметры
Изменение значений по умолчанию для cy.route()
По умолчанию cy.route() наследует некоторые параметры от cy.server().
В этом примере запросы, соответствующие шаблону, будут задерживаться на 1000 мс и иметь статус 422, но их response будет тем, что было установлено в cy.route().
cy.server({
method: 'POST',
delay: 1000,
status: 422,
response: {},
})
cy.route('/users/', { errors: 'Name cannot be blank' })
Изменение значения по умолчанию задержки для всех маршрутов
Добавление задержки может помочь смоделировать реальную задержку сети. Обычно подставленные ответы возвращаются менее чем за 20 мс. Добавление задержки может помочь визуализировать, как состояние приложения реагирует на запросы, которые находятся в процессе.
// delay each route's response 1500ms
cy.server({ delay: 1500 })
Отправка 404 для несоответствующих запросов
Если вы хотите, чтобы Cypress автоматически отправлял запросы, которые НЕ соответствуют маршрутам, следующий ответ:
| Статус | Тело | Заголовки |
|---|---|---|
404 |
"" | null |
Установите force404 на true.
cy.server({ force404: true })
cy.route('/activities/**', 'fixture:activities.json')
// Application Code
$(() => {
$.get('/activities')
// this will be sent back 404 since it
// does not match any of the cy.routes
$.getJSON('/users.json')
})
Изменение заголовков ответа по умолчанию для всех маршрутов
При подстановке запросов вы можете автоматически контролировать их ответные headers. Это полезно, когда вы хотите отправлять метаданные в headers, такие как информация о страничной навигации или токене.
Cypress автоматически устанавливает
Content-LengthиContent-Typeна основе подставленного вамиbodyответа.
cy.server({
headers: {
'x-token': 'abc-123-foo-bar',
},
})
cy.route('GET', '/users/1', { id: 1, name: 'Amanda' }).as('getUser')
cy.visit('/users/1/profile')
cy.wait('@getUser')
.its('responseHeaders')
.should('have.property', 'x-token', 'abc-123-foo-bar') // true
// Application Code
// lets use the native XHR object
const xhr = new XMLHttpRequest()
xhr.open('GET', '/users/1')
xhr.onload = function () {
const token = this.getResponseHeader('x-token')
console.log(token) // => abc-123-foo-bar
}
xhr.send()
Установить пользовательский заголовок запроса для всех запросов
cy.server({
onAnyRequest: (route, proxy) => {
proxy.xhr.setRequestHeader('CUSTOM-HEADER', 'Header value')
},
})
Изменение фильтрации по умолчанию
cy.server() поставляется с функцией ignore , которая по умолчанию фильтрует все запросы на статические ресурсы, такие как .html, .js, .jsx, и .css.
Любой запрос, прошедший проверку ignore , будет пропущен — он не будет регистрироваться и не будет подставляться каким-либо образом (даже если он соответствует конкретному cy.route()).
Идея в том, чтобы никогда не вмешиваться в статические ресурсы, которые извлекаются через Ajax.
Функция фильтрации по умолчанию в Cypress:
const ignore = (xhr) => {
// this function receives the xhr object in question and
// will ignore if it's a GET that appears to be a static resource
return (
xhr.method === 'GET' &&
/\.(jsx?|coffee|html|less|s?css|svg)(\?.*)?$/.test(xhr.url)
)
}
Вы можете переопределить эту функцию своей собственной логикой:
cy.server({
ignore: (xhr) => {
// specify your own function that should return
// truthy if you want this xhr to be ignored,
// not logged, and not stubbed.
},
})
Если вы хотите изменить параметр по умолчанию для ВСЕХ cy.server(), вы можете изменить этот параметр постоянно.
Отключить сервер после запуска
Вы можете отключить все подстановки и их эффекты и вернуть их к значению по умолчанию во время выполнения теста. Установив enable на false, это отключит подстановку маршрутов, и XHR больше не будут отображаться как (XHR Stub) в журнале команд. Тем не менее, псевдонимы маршрутизации могут по-прежнему использоваться и будут продолжать соответствовать запросам, но не будут влиять на ответы.
cy.server()
cy.route('POST', '/users', {}).as('createUser')
cy.server({ enable: false })
Примечания
Состояние между тестами
Сервер сохраняется до запуска следующего теста
Cypress автоматически сохраняет конфигурацию сервера и маршрутизации даже после завершения теста. Это означает, что вы можете продолжать использовать приложение и по-прежнему пользоваться подстановкой или другой конфигурацией сервера.
Однако между тестами, когда запускается новый тест, предыдущая конфигурация восстанавливается до чистого состояния. Конфигурация не сохраняется между тестами.
Незавершенные запросы автоматически прерываются между тестами
Когда запускается новый тест, все незавершенные запросы, которые все еще выполняются, автоматически прерываются. На самом деле это происходит по умолчанию, независимо от того, запустили ли вы cy.server().
cy.visit()
Сервер можно запустить до выполнения cy.visit()
Зачастую ваше приложение может выполнять начальные запросы сразу после загрузки (например, аутентификацию пользователя). Cypress позволяет запустить сервер и определить маршруты до выполнения cy.visit(). При последующем посещении сервер и маршруты будут немедленно применены перед загрузкой вашего приложения.
Вы можете подробнее узнать об XHR-стратегии здесь.
cy.request()
cy.server() не влияет на cy.request()
cy.server() и любая конфигурация, переданная в cy.server(), не оказывает влияния на cy.request().
Целью cy.request() является проверка конечных точек на фактически работающем сервере без необходимости запуска приложения front-end.
Правила
Требования
-
cy.server()требует цепочки вызовов отcy.
Утверждения
-
cy.server()не может иметь утверждений в цепочке.
Таймауты
-
cy.server()не может иметь таймауты.
Журнал команд
-
cy.server()не записывается в журнал команд
История
| Версия | Изменения |
|---|---|
| 6.0.0 | Устаревший cy.server() команда |
| 5.0.0 | Переименовано whitelist параметр на ignore
|
| 0.13.6 | Добавлен onAbort параметр обратного вызова |
| 0.5.10 | Добавлен delay параметр |
| 0.3.3 | Добавлен whitelist параметр |
| < 0.3.3 |
Добавлена cy.server() команда |
См. также
© 2017 Cypress.io
Licensed under the MIT License.
https://docs.cypress.io/api/commands/server