Vai al contenuto principale

L'Oggetto Mock

L'oggetto mock è un oggetto che rappresenta un mock di rete e contiene informazioni sulle richieste che corrispondono a un dato url e filterOptions. Può essere ottenuto utilizzando il comando mock.

info

Nota che l'utilizzo del comando mock richiede il supporto per il protocollo Chrome DevTools. Questo supporto è garantito se esegui i test localmente in un browser basato su Chromium o se utilizzi Selenium Grid v4 o superiore. Questo comando non può essere utilizzato durante l'esecuzione di test automatizzati nel cloud. Scopri di più nella sezione Automation Protocols.

Puoi leggere di più sul mock di richieste e risposte in WebdriverIO nella nostra guida Mocks and Spies.

Proprietà

Un oggetto mock contiene le seguenti proprietà:

NomeTipoDettagli
urlStringL'url passato al comando mock
filterOptionsObjectLe opzioni di filtro della risorsa passate al comando mock
browserObjectL'Oggetto Browser utilizzato per ottenere l'oggetto mock.
callsObject[]Informazioni sulle richieste del browser corrispondenti, contenenti proprietà come url, method, headers, initialPriority, referrerPolic, statusCode, responseHeaders e body

Metodi

Gli oggetti mock forniscono vari comandi, elencati nella sezione mock, che consentono agli utenti di modificare il comportamento della richiesta o della risposta.

Eventi

L'oggetto mock è un EventEmitter e vengono emessi diversi eventi per i tuoi casi d'uso.

Ecco una lista di eventi.

request

Questo evento viene emesso quando si avvia una richiesta di rete che corrisponde ai pattern del mock. La richiesta viene passata nel callback dell'evento.

Interfaccia della richiesta:

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

overwrite

Questo evento viene emesso quando la risposta di rete viene sovrascritta con respond o respondOnce. La risposta viene passata nel callback dell'evento.

Interfaccia della risposta:

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

fail

Questo evento viene emesso quando una richiesta di rete viene interrotta con abort o abortOnce. Il fallimento viene passato nel callback dell'evento.

Interfaccia del fallimento:

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

match

Questo evento viene emesso quando viene aggiunta una nuova corrispondenza, prima di continue o overwrite. La corrispondenza viene passata nel callback dell'evento.

Interfaccia della corrispondenza:

interface MatchEvent {
url: string // URL della richiesta (senza frammento).
urlFragment?: string // Frammento dell'URL richiesto che inizia con hash, se presente.
method: string // Metodo della richiesta HTTP.
headers: Record<string, string> // Header della richiesta HTTP.
postData?: string // Dati della richiesta HTTP POST.
hasPostData?: boolean // True quando la richiesta ha dati POST.
mixedContentType?: MixedContentType // Il tipo di export di contenuto misto della richiesta.
initialPriority: ResourcePriority // Priorità della richiesta di risorsa al momento dell'invio della richiesta.
referrerPolicy: ReferrerPolicy // La policy del referrer della richiesta, come definito in https://www.w3.org/TR/referrer-policy/
isLinkPreload?: boolean // Se è caricato tramite preload del link.
body: string | Buffer | JsonCompatible // Corpo della risposta della risorsa effettiva.
responseHeaders: Record<string, string> // Header della risposta HTTP.
statusCode: number // Codice di stato della risposta HTTP.
mockedResponse?: string | Buffer // Se il mock, che emette l'evento, ha anche modificato la sua risposta.
}

continue

Questo evento viene emesso quando la risposta di rete non è stata né sovrascritta né interrotta, o se la risposta è già stata inviata da un altro mock. requestId viene passato nel callback dell'evento.

Esempi

Ottenere il numero di richieste in sospeso:

let pendingRequests = 0
const mock = await browser.mock('**') // è importante corrispondere a tutte le richieste altrimenti, il valore risultante può essere molto confuso.
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`)
})

Lanciare un errore su un fallimento di rete 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)

// 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' })

Determinare se il valore di risposta del mock è stato utilizzato:

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', () => {
// si attiva per la prima richiesta a '**/foo/**'
}).on('continue', () => {
// si attiva per le richieste rimanenti a '**/foo/**'
})

secondMock.on('continue', () => {
// si attiva per la prima richiesta a '**/foo/bar/**'
}).on('overwrite', () => {
// si attiva per le richieste rimanenti a '**/foo/bar/**'
})

In questo esempio, firstMock è stato definito per primo e ha una chiamata respondOnce, quindi il valore di risposta di secondMock non verrà utilizzato per la prima richiesta, ma verrà utilizzato per le rimanenti.

Welcome! How can I help?

WebdriverIO AI Copilot