Chuyển đến nội dung chính

Đối tượng Mock

Đối tượng mock là một đối tượng đại diện cho một giả lập mạng và chứa thông tin về các yêu cầu phù hợp với urlfilterOptions đã cho. Nó có thể được nhận bằng cách sử dụng lệnh mock.

thông tin

Lưu ý rằng sử dụng lệnh mock yêu cầu hỗ trợ giao thức Chrome DevTools. Sự hỗ trợ đó được cung cấp nếu bạn chạy các bài kiểm tra cục bộ trong trình duyệt dựa trên Chromium hoặc nếu bạn sử dụng Selenium Grid v4 trở lên. Lệnh này không thể được sử dụng khi chạy kiểm tra tự động trên đám mây. Tìm hiểu thêm trong phần Giao thức tự động hóa.

Bạn có thể đọc thêm về giả lập yêu cầu và phản hồi trong WebdriverIO trong hướng dẫn Mocks và Spies của chúng tôi.

Thuộc tính

Một đối tượng mock chứa các thuộc tính sau:

TênKiểuChi tiết
urlStringURL được truyền vào lệnh mock
filterOptionsObjectCác tùy chọn bộ lọc tài nguyên được truyền vào lệnh mock
browserObjectĐối tượng Browser được sử dụng để lấy đối tượng mock.
callsObject[]Thông tin về các yêu cầu trình duyệt phù hợp, chứa các thuộc tính như url, method, headers, initialPriority, referrerPolic, statusCode, responseHeadersbody

Phương thức

Đối tượng mock cung cấp nhiều lệnh khác nhau, được liệt kê trong phần mock, cho phép người dùng sửa đổi hành vi của yêu cầu hoặc phản hồi.

Sự kiện

Đối tượng mock là một EventEmitter và một số sự kiện được phát ra cho các trường hợp sử dụng của bạn.

Dưới đây là danh sách các sự kiện.

request

Sự kiện này được phát ra khi phát hành yêu cầu mạng khớp với các mẫu mock. Yêu cầu được truyền vào callback sự kiện.

Giao diện Request:

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

overwrite

Sự kiện này được phát ra khi phản hồi mạng bị ghi đè bằng respond hoặc respondOnce. Phản hồi được truyền vào callback sự kiện.

Giao diện Response:

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

fail

Sự kiện này được phát ra khi yêu cầu mạng bị hủy bỏ bằng abort hoặc abortOnce. Thất bại được truyền vào callback sự kiện.

Giao diện Fail:

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

match

Sự kiện này được phát ra khi một kết quả khớp mới được thêm vào, trước continue hoặc overwrite. Kết quả khớp được truyền vào callback sự kiện.

Giao diện Match:

interface MatchEvent {
url: string // URL yêu cầu (không có fragment).
urlFragment?: string // Fragment của URL được yêu cầu bắt đầu bằng dấu #, nếu có.
method: string // Phương thức yêu cầu HTTP.
headers: Record<string, string> // Tiêu đề yêu cầu HTTP.
postData?: string // Dữ liệu yêu cầu HTTP POST.
hasPostData?: boolean // Đúng khi yêu cầu có dữ liệu POST.
mixedContentType?: MixedContentType // Loại xuất nội dung hỗn hợp của yêu cầu.
initialPriority: ResourcePriority // Ưu tiên của yêu cầu tài nguyên tại thời điểm yêu cầu được gửi.
referrerPolicy: ReferrerPolicy // Chính sách giới thiệu của yêu cầu, như được định nghĩa trong https://www.w3.org/TR/referrer-policy/
isLinkPreload?: boolean // Có được tải qua liên kết tải trước hay không.
body: string | Buffer | JsonCompatible // Nội dung phản hồi của tài nguyên thực tế.
responseHeaders: Record<string, string> // Tiêu đề phản hồi HTTP.
statusCode: number // Mã trạng thái phản hồi HTTP.
mockedResponse?: string | Buffer // Nếu mock phát ra sự kiện, cũng sửa đổi phản hồi của nó.
}

continue

Sự kiện này được phát ra khi phản hồi mạng không bị ghi đè cũng không bị gián đoạn, hoặc nếu phản hồi đã được gửi bởi một mock khác. requestId được truyền vào callback sự kiện.

Ví dụ

Lấy số lượng yêu cầu đang chờ xử lý:

let pendingRequests = 0
const mock = await browser.mock('**') // điều quan trọng là phải khớp tất cả các yêu cầu, nếu không, giá trị kết quả có thể rất gây nhầm lẫn.
mock.on('request', ({request}) => {
pendingRequests++
console.log(`khớp yêu cầu đến ${request.url}, đang chờ ${pendingRequests} yêu cầu`)
})
mock.on('match', ({url}) => {
pendingRequests--
console.log(`đã giải quyết yêu cầu đến ${url}, đang chờ ${pendingRequests} yêu cầu`)
})

Ném lỗi khi thất bại mạng 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(`yêu cầu đến ${url} thất bại với "Not Found"`))
}
})

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

// đợi ở đây, bởi vì một số yêu cầu vẫn có thể đang chờ xử lý
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' })

Xác định xem giá trị phản hồi mock có được sử dụng không:

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', () => {
// kích hoạt cho yêu cầu đầu tiên đến '**/foo/**'
}).on('continue', () => {
// kích hoạt cho các yêu cầu còn lại đến '**/foo/**'
})

secondMock.on('continue', () => {
// kích hoạt cho yêu cầu đầu tiên đến '**/foo/bar/**'
}).on('overwrite', () => {
// kích hoạt cho các yêu cầu còn lại đến '**/foo/bar/**'
})

Trong ví dụ này, firstMock được định nghĩa trước và có một lệnh gọi respondOnce, vì vậy giá trị phản hồi của secondMock sẽ không được sử dụng cho yêu cầu đầu tiên, nhưng sẽ được sử dụng cho các yêu cầu còn lại.

Welcome! How can I help?

WebdriverIO AI Copilot