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