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

Об'єкт Mock

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

інфо

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

Ви можете дізнатися більше про мокування запитів і відповідей у 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 // Якщо мок, що емітує подію, також модифікував свою відповідь.
}

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