Imitacje i Szpiedzy Żądań
WebdriverIO posiada wbudowaną obsługę modyfikowania odpowiedzi sieciowych, co pozwala skupić się na testowaniu aplikacji frontendowej bez konieczności konfigurowania backendu lub serwera imitującego. Możesz zdefiniować niestandardowe odpowiedzi dla zasobów internetowych, takich jak żądania REST API w swoim teście i dynamicznie je modyfikować.
Należy zauważyć, że korzystanie z polecenia mock wymaga wsparcia dla protokołu Chrome DevTools. To wsparcie jest dostępne, jeśli uruchamiasz testy lokalnie w przeglądarce opartej na Chromium, poprzez Selenium Grid w wersji 4 lub wyższej, lub za pośrednictwem dostawcy chmury z obsługą protokołu Chrome DevTools (np. SauceLabs, BrowserStack, LambdaTest). Pełne wsparcie dla różnych przeglądarek będzie dostępne, gdy wymagane elementy pojawią się w Webdriver Bidi i zostaną zaimplementowane w odpowiednich przeglądarkach.
Tworzenie imitacji
Zanim będziesz mógł modyfikować jakiekolwiek odpowiedzi, musisz najpierw zdefiniować imitację. Ta imitacja jest opisana przez URL zasobu i może być filtrowana według metody żądania lub nagłówków. Zasób obsługuje wyrażenia globalne przez minimatch:
// imituj wszystkie zasoby kończące się na "/users/list"
const userListMock = await browser.mock('**/users/list')
// lub możesz określić imitację, filtrując zasoby według nagłówków lub
// kodu statusu, imituj tylko udane żądania do zasobów json
const strictMock = await browser.mock('**', {
// imituj wszystkie odpowiedzi json
requestHeaders: { 'Content-Type': 'application/json' },
// które były udane
statusCode: 200
})
Określanie niestandardowych odpowiedzi
Po zdefiniowaniu imitacji możesz zdefiniować dla niej niestandardowe odpowiedzi. Te niestandardowe odpowiedzi mogą być obiektem do odpowiedzi w formacie JSON, lokalnym plikiem do odpowiedzi z niestandardowym elementem lub zasobem internetowym, aby zastąpić odpowiedź zasobem z internetu.
Imitowanie żądań API
Aby imitować żądania API, w których oczekujesz odpowiedzi JSON, wystarczy wywołać respond na obiekcie imitacji z dowolnym obiektem, który chcesz zwrócić, np.:
const mock = await browser.mock('https://todo-backend-express-knex.herokuapp.com/')
mock.respond([{
title: 'Injected (non) completed Todo',
order: null,
completed: false
}, {
title: 'Injected completed Todo',
order: null,
completed: true
}], {
headers: {
'Access-Control-Allow-Origin': '*'
},
fetchResponse: false
})
await browser.url('https://todobackend.com/client/index.html?https://todo-backend-express-knex.herokuapp.com/')
await $('#todo-list li').waitForExist()
console.log(await $$('#todo-list li').map(el => el.getText()))
// wyświetla: "[ 'Injected (non) completed Todo', 'Injected completed Todo' ]"
Możesz również modyfikować nagłówki odpowiedzi, a także kod statusu, przekazując niektóre parametry odpowiedzi imitacji w następujący sposób:
mock.respond({ ... }, {
// odpowiedz kodem statusu 404
statusCode: 404,
// połącz nagłówki odpowiedzi z następującymi nagłówkami
headers: { 'x-custom-header': 'foobar' }
})
Jeśli nie chcesz, aby imitacja w ogóle wywoływała backend, możesz przekazać false dla flagi fetchResponse.
mock.respond({ ... }, {
// nie wywołuj rzeczywistego backendu
fetchResponse: false
})
Zaleca się przechowywanie niestandardowych odpowiedzi w plikach elementów, dzięki czemu możesz je po prostu zaimportować w swoim teście w następujący sposób:
// wymaga Node.js v16.14.0 lub wyższego, aby obsługiwać asercje importu JSON
import responseFixture from './__fixtures__/apiResponse.json' assert { type: 'json' }
mock.respond(responseFixture)
Imitowanie zasobów tekstowych
Jeśli chcesz modyfikować zasoby tekstowe, takie jak pliki JavaScript, CSS lub inne zasoby tekstowe, możesz po prostu przekazać ścieżkę do pliku, a WebdriverIO zastąpi oryginalny zasób, np.:
const scriptMock = await browser.mock('**/script.min.js')
scriptMock.respond('./tests/fixtures/script.js')
// lub odpowiedz własnym kodem JS
scriptMock.respond('alert("I am a mocked resource")')