Zum Hauptinhalt springen

Das Mock-Objekt

Das Mock-Objekt ist ein Objekt, das einen Netzwerk-Mock repräsentiert und Informationen über Anfragen enthält, die mit der angegebenen url und den filterOptions übereinstimmen. Es kann mit dem Befehl mock empfangen werden.

Info

Beachten Sie, dass die Verwendung des mock-Befehls die Unterstützung des Chrome DevTools-Protokolls erfordert. Diese Unterstützung ist gegeben, wenn Sie Tests lokal in einem Chromium-basierten Browser ausführen oder wenn Sie Selenium Grid v4 oder höher verwenden. Dieser Befehl kann nicht verwendet werden, wenn automatisierte Tests in der Cloud ausgeführt werden. Weitere Informationen finden Sie im Abschnitt Automation Protocols.

Mehr über das Mocken von Anfragen und Antworten in WebdriverIO können Sie in unserem Mocks and Spies Leitfaden lesen.

Eigenschaften

Ein Mock-Objekt enthält die folgenden Eigenschaften:

NameTypDetails
urlStringDie URL, die an den Mock-Befehl übergeben wurde
filterOptionsObjectDie Ressourcen-Filteroptionen, die an den Mock-Befehl übergeben wurden
browserObjectDas Browser-Objekt, das verwendet wurde, um das Mock-Objekt zu erhalten.
callsObject[]Informationen über übereinstimmende Browser-Anfragen, die Eigenschaften wie url, method, headers, initialPriority, referrerPolic, statusCode, responseHeaders und body enthalten

Methoden

Mock-Objekte bieten verschiedene Befehle, die im Abschnitt mock aufgeführt sind und es Benutzern ermöglichen, das Verhalten der Anfrage oder Antwort zu modifizieren.

Events

Das Mock-Objekt ist ein EventEmitter und es werden einige Events für Ihre Anwendungsfälle ausgelöst.

Hier ist eine Liste der Events.

request

Dieses Event wird ausgelöst, wenn eine Netzwerkanfrage gestartet wird, die mit den Mock-Mustern übereinstimmt. Die Anfrage wird im Event-Callback übergeben.

Request-Interface:

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

overwrite

Dieses Event wird ausgelöst, wenn die Netzwerkantwort mit respond oder respondOnce überschrieben wird. Die Antwort wird im Event-Callback übergeben.

Response-Interface:

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

fail

Dieses Event wird ausgelöst, wenn die Netzwerkanfrage mit abort oder abortOnce abgebrochen wird. Der Fehler wird im Event-Callback übergeben.

Fail-Interface:

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

match

Dieses Event wird ausgelöst, wenn eine neue Übereinstimmung hinzugefügt wird, vor continue oder overwrite. Die Übereinstimmung wird im Event-Callback übergeben.

Match-Interface:

interface MatchEvent {
url: string // Request URL (without fragment).
urlFragment?: string // Fragment of the requested URL starting with hash, if present.
method: string // HTTP request method.
headers: Record<string, string> // HTTP request headers.
postData?: string // HTTP POST request data.
hasPostData?: boolean // True when the request has POST data.
mixedContentType?: MixedContentType // The mixed content export type of the request.
initialPriority: ResourcePriority // Priority of the resource request at the time request is sent.
referrerPolicy: ReferrerPolicy // The referrer policy of the request, as defined in https://www.w3.org/TR/referrer-policy/
isLinkPreload?: boolean // Whether is loaded via link preload.
body: string | Buffer | JsonCompatible // Body response of actual resource.
responseHeaders: Record<string, string> // HTTP response headers.
statusCode: number // HTTP response status code.
mockedResponse?: string | Buffer // If mock, emitting the event, also modified it's response.
}

continue

Dieses Event wird ausgelöst, wenn die Netzwerkantwort weder überschrieben noch unterbrochen wurde, oder wenn die Antwort bereits von einem anderen Mock gesendet wurde. requestId wird im Event-Callback übergeben.

Beispiele

Ermitteln der Anzahl ausstehender Anfragen:

let pendingRequests = 0
const mock = await browser.mock('**') // it is important to match all requests otherwise, the resulting value can be very confusing.
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`)
})

Einen Fehler bei einem 404-Netzwerkfehler auslösen:

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)

// waiting here, because some requests can still be pending
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' })

Feststellen, ob der Mock-Antwortwert verwendet wurde:

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', () => {
// triggers for first request to '**/foo/**'
}).on('continue', () => {
// triggers for rest requests to '**/foo/**'
})

secondMock.on('continue', () => {
// triggers for first request to '**/foo/bar/**'
}).on('overwrite', () => {
// triggers for rest requests to '**/foo/bar/**'
})

In diesem Beispiel wurde firstMock zuerst definiert und hat einen respondOnce-Aufruf, daher wird der Antwortwert von secondMock für die erste Anfrage nicht verwendet, aber für alle weiteren Anfragen.

Welcome! How can I help?

WebdriverIO AI Copilot