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
.
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 :
Nom | Type | Détails |
---|---|---|
url | String | L'URL passée à la commande mock |
filterOptions | Object | Les options de filtrage de 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 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.