Перейти до основного вмісту

Об'єкт Mock

Об'єкт mock — це об'єкт, що представляє мережевий макет і містить інформацію про запити, які відповідають заданому url і filterOptions. Його можна отримати за допомогою команди mock.

інфо

Зауважте, що використання команди mock вимагає підтримки протоколу Chrome DevTools. Ця підтримка надається, якщо ви запускаєте тести локально в браузері на основі Chromium або якщо ви використовуєте Selenium Grid версії 4 або вище. Цю команду неможливо використовувати при запуску автоматизованих тестів у хмарі. Дізнайтеся більше в розділі Протоколи автоматизації.

Ви можете прочитати більше про імітацію запитів та відповідей у WebdriverIO в нашому посібнику Макети та шпигуни.

Властивості

Об'єкт mock містить такі властивості:

НазваТипДеталі
urlStringURL, переданий у команду mock
filterOptionsObjectПараметри фільтрації ресурсів, передані в команду mock
browserObjectОб'єкт браузера, використаний для отримання об'єкта mock.
callsObject[]Інформація про відповідні запити браузера, що містить властивості, такі як url, method, headers, initialPriority, referrerPolic, statusCode, responseHeaders і body

Методи

Об'єкти mock надають різні команди, перелічені в розділі mock, які дозволяють користувачам змінювати поведінку запиту або відповіді.

Події

Об'єкт mock є EventEmitter, і для ваших випадків використання видається кілька подій.

Ось список подій.

request

Ця подія видається при запуску мережевого запиту, який відповідає шаблонам mock. Запит передається у зворотному виклику події.

Інтерфейс запиту:

interface RequestEvent {
requestId: number
request: Matches
responseStatusCode: number
responseHeaders: Record<string, string>
}

overwrite

Ця подія видається, коли мережева відповідь перезаписується за допомогою respond або respondOnce. Відповідь передається у зворотному виклику події.

Інтерфейс відповіді:

interface OverwriteEvent {
requestId: number
responseCode: number
responseHeaders: Record<string, string>
body?: string | Record<string, any>
}

fail

Ця подія видається, коли мережевий запит перервано за допомогою abort або abortOnce. Помилка передається у зворотному виклику події.

Інтерфейс помилки:

interface FailEvent {
requestId: number
errorReason: Protocol.Network.ErrorReason
}

match

Ця подія видається, коли додається нове співпадіння, перед continue або overwrite. Співпадіння передається у зворотному виклику події.

Інтерфейс співпадіння:

interface MatchEvent {
url: string // URL запиту (без фрагмента).
urlFragment?: string // Фрагмент запитуваного URL, що починається з хешу, якщо присутній.
method: string // Метод HTTP-запиту.
headers: Record<string, string> // Заголовки HTTP-запиту.
postData?: string // Дані HTTP POST-запиту.
hasPostData?: boolean // True, коли запит має дані POST.
mixedContentType?: MixedContentType // Тип експорту змішаного вмісту запиту.
initialPriority: ResourcePriority // Пріоритет запиту ресурсу на момент відправлення запиту.
referrerPolicy: ReferrerPolicy // Політика реферера запиту, як визначено в https://www.w3.org/TR/referrer-policy/
isLinkPreload?: boolean // Чи завантажується через попереднє завантаження посилання.
body: string | Buffer | JsonCompatible // Тіло відповіді фактичного ресурсу.
responseHeaders: Record<string, string> // Заголовки HTTP-відповіді.
statusCode: number // Код статусу HTTP-відповіді.
mockedResponse?: string | Buffer // Якщо mock, що видає подію, також змінив свою відповідь.
}

continue

Ця подія видається, коли мережева відповідь не була ні перезаписана, ні перервана, або якщо відповідь уже була відправлена іншим макетом. У зворотному виклику події передається requestId.

Приклади

Отримання кількості очікуючих запитів:

let pendingRequests = 0
const mock = await browser.mock('**') // важливо відповідати всім запитам, інакше результуюче значення може бути дуже заплутаним.
mock.on('request', ({request}) => {
pendingRequests++
console.log(`matched request to ${request.url}, pending ${pendingRequests} requests`)
})
mock.on('match', ({url}) => {
pendingRequests--
console.log(`resolved request to ${url}, pending ${pendingRequests} requests`)
})

Викидання помилки при мережевій помилці 404:

browser.addCommand('loadPageWithout404', (url, {selector, predicate}) => new Promise(async (resolve, reject) => {
const mock = await this.mock('**')

mock.on('match', ({url, statusCode}) => {
if (statusCode === 404) {
reject(new Error(`request to ${url} failed with "Not Found"`))
}
})

await this.url(url).catch(reject)

// очікуємо тут, оскільки деякі запити можуть все ще очікувати
if (selector) {
await this.$(selector).waitForExist().catch(reject)
}

if (predicate) {
await this.waitUntil(predicate).catch(reject)
}

resolve()
}))

await browser.loadPageWithout404(browser, 'some/url', { selector: 'main' })

Визначення, чи було використано значення відповіді mock:

const firstMock = await browser.mock('**/foo/**')
const secondMock = await browser.mock('**/foo/bar/**')

firstMock.respondOnce({id: 3, title: 'three'})
secondMock.respond({id: 4, title: 'four'})

firstMock.on('overwrite', () => {
// спрацьовує для першого запиту до '**/foo/**'
}).on('continue', () => {
// спрацьовує для решти запитів до '**/foo/**'
})

secondMock.on('continue', () => {
// спрацьовує для першого запиту до '**/foo/bar/**'
}).on('overwrite', () => {
// спрацьовує для решти запитів до '**/foo/bar/**'
})

У цьому прикладі firstMock був визначений першим і має один виклик respondOnce, тому значення відповіді secondMock не буде використовуватися для першого запиту, але буде використовуватися для всіх інших.

Welcome! How can I help?

WebdriverIO AI Copilot