Aller au contenu principal

L'Objet Mock

L'objet mock est un objet qui reprĂ©sente une simulation de rĂ©seau et contient des informations sur les requĂȘtes correspondant Ă  une url et des filterOptions donnĂ©es. Il peut ĂȘtre obtenu en utilisant la commande mock.

info

Notez que l'utilisation de la commande mock nĂ©cessite la prise en charge du protocole Chrome DevTools. Cette prise en charge est assurĂ©e si vous exĂ©cutez des tests localement dans un navigateur basĂ© sur Chromium ou si vous utilisez Selenium Grid v4 ou supĂ©rieur. Cette commande ne peut pas ĂȘtre utilisĂ©e lors de l'exĂ©cution de tests automatisĂ©s dans le cloud. Pour en savoir plus, consultez la section Protocoles d'automatisation.

Vous pouvez en savoir plus sur la simulation des requĂȘtes et des rĂ©ponses dans WebdriverIO dans notre guide Mocks et Spies.

PropriĂ©tĂ©s​

Un objet mock contient les propriétés suivantes :

NomTypeDétails
urlStringL'URL passée à la commande mock
filterOptionsObjectLes options de filtrage de ressources passées à la commande mock
browserObjectL'Objet Browser utilisé pour obtenir l'objet mock.
callsObject[]Informations sur les requĂȘtes du navigateur correspondantes, contenant des propriĂ©tĂ©s telles que url, method, headers, initialPriority, referrerPolic, statusCode, responseHeaders et body

MĂ©thodes​

Les objets mock fournissent diverses commandes, listĂ©es dans la section mock, qui permettent aux utilisateurs de modifier le comportement de la requĂȘte ou de la rĂ©ponse.

ÉvĂ©nements​

L'objet mock est un EventEmitter et plusieurs événements sont émis pour vos cas d'utilisation.

Voici une liste des événements.

request​

Cet Ă©vĂ©nement est Ă©mis lors du lancement d'une requĂȘte rĂ©seau qui correspond aux modĂšles de mock. La requĂȘte est transmise dans le callback de l'Ă©vĂ©nement.

Interface de requĂȘte :

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

overwrite​

Cet événement est émis lorsque la réponse réseau est remplacée avec respond ou respondOnce. La réponse est transmise dans le callback de l'événement.

Interface de réponse :

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

fail​

Cet Ă©vĂ©nement est Ă©mis lorsque la requĂȘte rĂ©seau est interrompue avec abort ou abortOnce. L'Ă©chec est transmis dans le callback de l'Ă©vĂ©nement.

Interface d'échec :

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

match​

Cet événement est émis lorsqu'une nouvelle correspondance est ajoutée, avant continue ou overwrite. La correspondance est transmise dans le callback de l'événement.

Interface de correspondance :

interface MatchEvent {
url: string // URL de la requĂȘte (sans fragment).
urlFragment?: string // Fragment de l'URL demandée commençant par un hash, si présent.
method: string // MĂ©thode de requĂȘte HTTP.
headers: Record<string, string> // En-tĂȘtes de requĂȘte HTTP.
postData?: string // DonnĂ©es de requĂȘte HTTP POST.
hasPostData?: boolean // Vrai lorsque la requĂȘte a des donnĂ©es POST.
mixedContentType?: MixedContentType // Le type d'export de contenu mixte de la requĂȘte.
initialPriority: ResourcePriority // PrioritĂ© de la requĂȘte de ressource au moment oĂč la requĂȘte est envoyĂ©e.
referrerPolicy: ReferrerPolicy // La politique de rĂ©fĂ©rent de la requĂȘte, telle que dĂ©finie dans https://www.w3.org/TR/referrer-policy/
isLinkPreload?: boolean // Si elle est chargée via un préchargement de lien.
body: string | Buffer | JsonCompatible // Corps de réponse de la ressource réelle.
responseHeaders: Record<string, string> // En-tĂȘtes de rĂ©ponse HTTP.
statusCode: number // Code d'état de réponse HTTP.
mockedResponse?: string | Buffer // Si le mock émettant l'événement a également modifié sa réponse.
}

continue​

Cet événement est émis lorsque la réponse réseau n'a été ni remplacée ni interrompue, ou si la réponse a déjà été envoyée par un autre mock. requestId est transmis dans le callback de l'événement.

Exemples​

Obtenir le nombre de requĂȘtes en attente :

let pendingRequests = 0
const mock = await browser.mock('**') // il est important de correspondre Ă  toutes les requĂȘtes, sinon la valeur rĂ©sultante peut ĂȘtre trĂšs dĂ©routante.
mock.on('request', ({request}) => {
pendingRequests++
console.log(`requĂȘte correspondante vers ${request.url}, ${pendingRequests} requĂȘtes en attente`)
})
mock.on('match', ({url}) => {
pendingRequests--
console.log(`requĂȘte rĂ©solue vers ${url}, ${pendingRequests} requĂȘtes en attente`)
})

Lancer une erreur sur un échec réseau 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(`la requĂȘte vers ${url} a Ă©chouĂ© avec "Not Found"`))
}
})

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

// attente ici, car certaines requĂȘtes peuvent encore ĂȘtre en attente
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' })

Déterminer si la valeur de réponse du mock a été utilisée :

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', () => {
// se dĂ©clenche pour la premiĂšre requĂȘte vers '**/foo/**'
}).on('continue', () => {
// se dĂ©clenche pour les requĂȘtes restantes vers '**/foo/**'
})

secondMock.on('continue', () => {
// se dĂ©clenche pour la premiĂšre requĂȘte vers '**/foo/bar/**'
}).on('overwrite', () => {
// se dĂ©clenche pour les requĂȘtes restantes vers '**/foo/bar/**'
})

Dans cet exemple, firstMock a Ă©tĂ© dĂ©fini en premier et a un appel respondOnce, donc la valeur de rĂ©ponse de secondMock ne sera pas utilisĂ©e pour la premiĂšre requĂȘte, mais sera utilisĂ©e pour le reste des requĂȘtes.

Welcome! How can I help?

WebdriverIO AI Copilot