respond
Обзор
Подменяет ответы на подходящие запросы, пока правило активно. Исходный запрос в BiDi все равно отправляется на сервер; это не способ запретить побочные эффекты запроса.
Использование
mock.respond(overwrites, params)
Параметры команды
| Параметр | BiDi | Classic/CDP |
|---|---|---|
overwrites | Строка тела или JSON-объект/массив. Callback для тела не поддерживается. | Строка, JSON или функция, получающая запись запроса и клиент. Функция может вернуть Promise. |
params.headers | Заголовки ответа: объект или синхронная функция от события ответа. Заменяют набор заголовков. | Объект или функция. Дополняют исходные заголовки. |
params.statusCode | Число или синхронная функция от события ответа. | Число или функция. |
params.cookies | Массив Cookie[] в формате WebDriver или синхронная функция от события ответа. | Не поддерживается этой реализацией. |
params.fetchResponse | Не применяется: подмена выполняется на стадии ответа, запрос доходит до сервера. | Boolean, по умолчанию true. При false ответ подменяется до загрузки оригинального тела. |
В params.cookies передавайте строковое value и поле expiry (время Unix в секундах), а не BiDi-объект value и поле expires. Библиотека сама преобразует cookies в формат BiDi.
Имя параметра — headers, не header. Без переопределения метаданных используются исходные значения.
Ограничения
В BiDi строка с путем к файлу или URL остается текстом ответа. Команда не читает файл и не перенаправляет запрос; для изменения URL используйте redirect. В Classic/CDP существующий путь читается как локальный файл, а строка с HTTP(S)-URL задает ответ-перенаправление.
Не смешивайте постоянные и однократные правила без учета реализации. В BiDi respond() заменяет очередь ответов постоянным правилом. respondOnce() убирает постоянное правило и добавляет однократное к другим однократным. В CDP правила добавляются в очередь, и ранее добавленное постоянное правило может перекрыть последующие.
Результат
BiDi синхронно возвращает тот же объект мока. Classic/CDP не возвращает полезного значения. Для удаления подмены и перехватчика вызовите await mock.restore().
Пример
Пример использует Chrome с WebDriver BiDi. Укажите в baseUrl адрес тестового HTTP-сервера: / отдает HTML-страницу, а /api/items — JSON с полем source: "original" и статусом 200. Явная подписка на события нужна для новых сессий в одном воркере в WDIO 9.6.2.
const assert = require("node:assert/strict");
it("mock.respond: replace response data and metadata in BiDi", async ({ browser }) => {
await browser.url("/");
await browser.sessionSubscribe({
events: ["network.beforeRequestSent", "network.responseStarted"],
});
const mock = await browser.mock("/api/items");
try {
mock.respond(
{ source: "mocked" },
{
statusCode: 201,
headers: { "content-type": "application/json", "x-example": "response" },
cookies: [
{
name: "mock-example",
value: "ready",
domain: new URL(await browser.getUrl()).hostname,
path: "/",
},
],
},
);
for (let i = 0; i < 2; i++) {
const result = await browser.execute(async () => {
const response = await fetch("/api/items", { cache: "no-store" });
return {
status: response.status,
header: response.headers.get("x-example"),
body: await response.json(),
};
});
assert.deepEqual(result, {
status: 201,
header: "response",
body: { source: "mocked" },
});
}
} finally {
await mock.restore();
}
});
Связанные команды
Источники
Материал учитывает исходную статью WebdriverIO.