Перейти к основному содержимому

mock

Обзор

Используйте команду mock, чтобы имитировать ответ на запрос.

Вы можете включать имитацию в зависимости от урла, заголовков или статус-кода. Вызов метода mock возвращает объект-заглушку (stub), который вы можете использовать, чтобы модифицировать ответ от веб-ресурса. С помощью объекта-заглушки вы можете возвращать ответ-имитацию или ронять запрос.

Существует 3 способа модифицировать ответ:

  • вернуть кастомный JSON-объект (например, чтобы имитировать ответ на API-запрос);
  • заменить ответ локальным файлом (подсунуть модифицированный JavaScript-файл);
  • перенаправить на другой URL и подсунуть полученный оттуда ответ.
warning

Команда mock работает только при использовании Chrome DevTools Protocol (CDP).

Читайте подробности в разделе «Как использовать Chrome DevTools Protocol в testplane».

А также читайте рецепт «Как отслеживать и перехватывать сетевые запросы и ответы».

Использование

await browser.mock(url, { method, headers, responseHeaders, postData, statusCode });

Параметры команды

ИмяТипОписание
urlStringURL, запрос которого нужно имитировать.
methodString или Functionhttp-метод, по которому нужно фильтровать ресурс.
headersObject или FunctionЗаголовки запроса, по которым нужно фильтровать ресурс.
responseHeadersObject или FunctionЗаголовки ответа, по которым нужно фильтровать ресурс.
postDataString или FunctionpostData запроса, по которому нужно фильтровать ресурс.
statusCodeNumber или FunctionКод статуса, по которому нужно фильтровать ресурс.

Примеры использования

it("should mock network resources", async ({ browser }) => {
// используем статическую строку
const userListMock = await browser.mock("**" + "/users/list");

// также мы можем имитировать ответы в зависимости
// от заголовков запроса или ответа, статус-кода, или postData
const strictMock = await browser.mock("**", {
// мокаем все json-ответы
statusCode: 200,
headers: { "Content-Type": "application/json" },
responseHeaders: { "Cache-Control": "no-cache" },
postData: "foobar",
});

// функция-компаратор
const apiV1Mock = await browser.mock("**" + "/api/v1", {
statusCode: statusCode => statusCode >= 200 && statusCode <= 203,
headers: headers =>
headers["Authorization"] && headers["Authorization"].startsWith("Bearer "),
responseHeaders: headers => headers["Impersonation"],
postData: data => typeof data === "string" && data.includes("foo"),
});
});

it("should modify API responses", async ({ browser }) => {
// фильтруем по методу
const todoMock = await browser.mock("**" + "/todos", {
method: "get",
});

// имитируем ответ эндпойнта заготовленной фикстурой
mock.respond([
{
title: "Injected Todo",
order: null,
completed: false,
url: "http://todo-backend-express-knex.herokuapp.com/916",
},
]);

// отвечаем другим статус-кодом или заголовком
mock.respond(
[
{
title: "Injected Todo",
order: null,
completed: false,
url: "http://todo-backend-express-knex.herokuapp.com/916",
},
],
{
statusCode: 404,
headers: {
"x-custom-header": "foobar",
},
},
);
});

it("should modify text assets", async ({ browser }) => {
const scriptMock = await browser.mock("**" + "/script.min.js");
scriptMock.respond("./tests/fixtures/script.js");
});

it("should redirect web resources", async ({ browser }) => {
const headerMock = await browser.mock("**" + "/header.png");
headerMock.respond("https://media.giphy.com/media/F9hQLAVhWnL56/giphy.gif");

const pageMock = await browser.mock("https://google.com/");
pageMock.respond("https://webdriver.io");
await browser.url("https://google.com");

console.log(await browser.getTitle());
// выведет: "WebdriverIO · Next-gen browser and mobile automation test framework for Node.js"
});