L'Objet Mock
L'objet mock est un objet qui reprĂ©sente une simulation rĂ©seau et contient des informations sur les requĂȘtes correspondant Ă une url et des filterOptions donnĂ©s. Il peut ĂȘtre obtenu en utilisant la commande mock.
Notez que l'utilisation de la commande mock nécessite la prise en charge du protocole Chrome DevTools.
Cette prise en charge est disponible 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 :
| Nom | Type | Détails |
|---|---|---|
url | String | L'URL passée à la commande mock |
filterOptions | Object | Les options de filtrage des ressources passées à la commande mock |
browser | Object | L'Objet Browser utilisé pour obtenir l'objet mock. |
calls | Object[] | 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 mock. La requĂȘte est passĂ©e 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 passée 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 lorsqu'une requĂȘte rĂ©seau est interrompue avec abort ou abortOnce. L'Ă©chec est passĂ© 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 passée 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 passé 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 pour ${request.url}, ${pendingRequests} requĂȘtes en attente`)
})
mock.on('match', ({url}) => {
pendingRequests--
console.log(`requĂȘte rĂ©solue pour ${url}, ${pendingRequests} requĂȘtes en attente`)
})
Générer une erreur en cas d'é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 ĂȘtre encore 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 le reste des requĂȘtes vers '**/foo/**'
})
secondMock.on('continue', () => {
// se dĂ©clenche pour la premiĂšre requĂȘte vers '**/foo/bar/**'
}).on('overwrite', () => {
// se dĂ©clenche pour le reste des requĂȘtes vers '**/foo/bar/**'
})
Dans cet exemple, firstMock a Ă©tĂ© dĂ©fini en premier et possĂšde 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 les suivantes.