mock
Simule a resposta de uma requisição. Você pode definir uma simulação baseada em um padrão URLPattern correspondente e cabeçalho e código de status correspondentes. Chamar o método mock retorna um objeto stub que você pode usar para modificar a resposta do recurso web.
Com o objeto stub, você pode então retornar uma resposta personalizada ou fazer com que a requisição falhe.
Existem 3 maneiras de modificar a resposta:
- retornar um objeto JSON personalizado (para simular requisições de API)
- substituir o recurso web por um arquivo local (servir um arquivo JavaScript modificado) ou
- redirecionar o recurso para uma URL diferente
Observe que usar o comando mock
requer suporte para WebDriver Bidi. Isso
geralmente é o caso quando você executa testes localmente em um navegador baseado em Chromium ou no
Firefox, bem como se você usar um Selenium Grid v4 ou superior. Se você executar testes
na nuvem, certifique-se de que seu provedor de nuvem suporte WebDriver Bidi.
O URLPattern
é uma tecnologia experimental e ainda não é suportado em alguns ambientes, como Node.js.
Recomendamos importar um polyfill
até que o recurso seja mais amplamente suportado.
Uso
browser.mock(url, { method, requestHeaders, responseHeaders, postData, statusCode })
Parâmetros
Nome | Tipo | Detalhes |
---|---|---|
url | String | url para simular |
filterOptions opcional | MockFilterOptions | filtrar recurso simulado por opções adicionais |
filterOptions.method opcional | String, Function | filtrar recurso por método HTTP |
filterOptions.requestHeaders opcional | Object, Function | filtrar recurso por cabeçalhos de requisição específicos |
filterOptions.responseHeaders opcional | Object, Function | filtrar recurso por cabeçalhos de resposta específicos |
filterOptions.postData opcional | String, Function | filtrar recurso por postData da requisição |
filterOptions.statusCode opcional | Number, Function | filtrar recurso por código de status da resposta |
Exemplo
it('should mock network resources', async () => {
// via static string
const userListMock = await browser.mock('**' + '/users/list')
// or as regular expression
const userListMock = await browser.mock(/https:\/\/(domainA|domainB)\.com\/.+/)
// you can also specifying the mock even more by filtering resources
// by request or response headers, status code, postData, e.g. mock only responses with specific
// header set and statusCode
const strictMock = await browser.mock('**', {
// mock all json responses
statusCode: 200,
requestHeaders: { 'Content-Type': 'application/json' },
responseHeaders: { 'Cache-Control': 'no-cache' },
postData: 'foobar'
})
// comparator function
const apiV1Mock = await browser.mock('**' + '/api/v1', {
statusCode: (statusCode) => statusCode >= 200 && statusCode <= 203,
requestHeaders: (headers) => headers['Authorization'] && headers['Authorization'].startsWith('Bearer '),
responseHeaders: (headers) => headers['Impersonation'],
postData: (data) => typeof data === 'string' && data.includes('foo')
})
})
it('should modify API responses', async () => {
// filter by method
const todoMock = await browser.mock('**' + '/todos', {
method: 'get'
})
// mock an endpoint with a fixed fixture
todoMock.respond([{
title: 'Injected Todo',
order: null,
completed: false,
url: "http://todo-backend-express-knex.herokuapp.com/916"
}])
// respond with different status code or header
todoMock.respond([{
title: 'Injected Todo',
order: null,
completed: false,
url: "http://todo-backend-express-knex.herokuapp.com/916"
}], {
statusCode: 404,
headers: {
'x-custom-header': 'foobar'
}
})
})
it('should modify text assets', async () => {
const scriptMock = await browser.mock('**' + '/script.min.js')
scriptMock.respond('./tests/fixtures/script.js')
})
it('should redirect web resources', async () => {
const headerMock = await browser.mock('**' + '/header.png')
headerMock.respond('https://media.giphy.com/media/F9hQLAVhWnL56/giphy.gif')
const pageMock = await browser.mock('https://google.com/')
pageMock.respond('https://webdriver.io')
await browser.url('https://google.com')
console.log(await browser.getTitle()) // returns "WebdriverIO · Next-gen browser and mobile automation test framework for Node.js"
})
Retorna
- <Mock>
return
: um objeto mock para modificar a resposta