mock
Mock the response of a request. You can define a mock based on a matching glob and corresponding header and status code. Calling the mock method returns a stub object that you can use to modify the response of the web resource.
This is a beta feature. Please give us feedback and file an issue if certain scenarios don't work as expected!
With the stub object you can then either return a custom response or have the request fail.
There are 3 ways to modify the response:
- return a custom JSON object (for stubbing API request)
- replace web resource with a local file (service a modified JavaScript file) or
- redirect resource to a different url
Usage
browser.mock(url, { method, headers, responseHeaders, postData, statusCode })
Parameters
Name | Type | Details |
---|---|---|
url | String | url to mock |
filterOptions optional | MockFilterOptions | filter mock resource by additional options |
filterOptions.method optional | String , Function | filter resource by HTTP method |
filterOptions.headers optional | Object , Function | filter resource by specific request headers |
filterOptions.responseHeaders optional | Object , Function | filter resource by specific response headers |
filterOptions.postData optional | String , Function | filter resource by request postData |
filterOptions.statusCode optional | Number , Function | filter resource by response statusCode |
Example
it('should mock network resources', () => {
// via static string
const userListMock = browser.mock('**' + '/users/list')
// 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 = browser.mock('**', {
// mock all json responses
statusCode: 200,
headers: { 'Content-Type': 'application/json' },
responseHeaders: { 'Cache-Control': 'no-cache' },
postData: 'foobar'
})
// comparator function
const apiV1Mock = browser.mock('**' + '/api/v1', {
statusCode: (statusCode) => statusCode >= 200 && statusCode <= 203,
headers: (headers) => headers['Authorization'] && headers['Authorization'].startsWith('Bearer '),
responseHeaders: (headers) => headers['Impersonation'],
postData: (data) => typeof data === 'string' && data.includes('foo')
})
})
it('should modify API responses', () => {
// filter by method
const todoMock = browser.mock('**' + '/todos', {
method: 'get'
})
// mock an endpoint with a fixed fixture
mock.respond([{
title: 'Injected Todo',
order: null,
completed: false,
url: "http://todo-backend-express-knex.herokuapp.com/916"
}])
// respond with different status code or header
mock.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', () => {
const scriptMock = browser.mock('**' + '/script.min.js')
scriptMock.respond('./tests/fixtures/script.js')
})
it('should redirect web resources', () => {
const headerMock = browser.mock('**' + '/header.png')
headerMock.respond('https://media.giphy.com/media/F9hQLAVhWnL56/giphy.gif')
const pageMock = browser.mock('https://google.com/')
pageMock.respond('https://webdriver.io')
browser.url('https://google.com')
console.log(browser.getTitle()) // returns "WebdriverIO · Next-gen browser and mobile automation test framework for Node.js"
})