Skip to content

Instantly share code, notes, and snippets.

@neodigm
Forked from cowboy/mock-axios.js
Created May 23, 2021 16:22
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save neodigm/2b2dc9253ad72147e3a7bd5bdc0e7a53 to your computer and use it in GitHub Desktop.
Save neodigm/2b2dc9253ad72147e3a7bd5bdc0e7a53 to your computer and use it in GitHub Desktop.
axios mocking via interceptors
import axios from 'axios'
let mockingEnabled = false
const mocks = {}
export function addMock(url, data) {
mocks[url] = data
}
export function enableMocking(state) {
mockingEnabled = state
}
const isUrlMocked = url => url in mocks
const getMockError = config => {
const mockError = new Error()
mockError.mockData = mocks[config.url]
mockError.config = config
return Promise.reject(mockError)
}
const isMockError = error => Boolean(error.mockData)
const getMockResponse = mockError => {
const {mockData, config} = mockError
// Handle mocked error (any non-2xx status code)
if (mockData.status && String(mockData.status)[0] !== '2') {
const err = new Error(mockData.message || 'mock error')
err.code = mockData.status
return Promise.reject(err)
}
// Handle mocked success
return Promise.resolve(Object.assign({
data: {},
status: 200,
statusText: 'OK',
headers: {},
config,
isMock: true
}, mockData))
}
// Add a request interceptor
axios.interceptors.request.use(config => {
if (mockingEnabled && isUrlMocked(config.url)) {
console.log('axios mocking ' + config.url)
return getMockError(config)
}
return config
}, error => Promise.reject(error))
// Add a response interceptor
axios.interceptors.response.use(response => response, error => {
if (isMockError(error)) {
return getMockResponse(error)
}
return Promise.reject(error)
})
import axios from 'axios'
import {addMock, enableMocking} from './mock-axios'
addMock('https://dog.ceo/api/breeds/list/all', {data: {mock: 'dogs'}})
addMock('https://dog.ceo/404-page', {status: 404, message: 'whoops'})
enableMocking(true)
// mocked
let result = await axios.get('https://dog.ceo/api/breeds/list/all')
console.log(1, result)
try {
result = await axios.get('https://dog.ceo/404-page')
} catch (err) {
console.log(2, err)
}
// not mocked
result = await axios.get('https://dog.ceo/api/breeds/list/all?foo=1')
console.log(3, result)
try {
result = await axios.get('https://dog.ceo/unhandled-404')
} catch (err) {
console.log(4, err)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment