Skip to content

Instantly share code, notes, and snippets.

@sliim35
Forked from cowboy/mock-axios.js
Created July 19, 2019 09:11
Show Gist options
  • Select an option

  • Save sliim35/15a0467a2d0e8d0029b58550d57863c7 to your computer and use it in GitHub Desktop.

Select an option

Save sliim35/15a0467a2d0e8d0029b58550d57863c7 to your computer and use it in GitHub Desktop.

Revisions

  1. @cowboy cowboy revised this gist Nov 8, 2017. 2 changed files with 36 additions and 24 deletions.
    35 changes: 11 additions & 24 deletions axios-mocking.js → mock-axios.js
    Original file line number Diff line number Diff line change
    @@ -1,10 +1,15 @@
    const axios = require('axios')
    import axios from 'axios'

    const mockingEnabled = true
    let mockingEnabled = false

    const mocks = {
    'https://dog.ceo/api/breeds/list/all': {data: {mock: 'dogs'}},
    'https://dog.ceo/404-page': {status: 404, message: 'whoops'}
    const mocks = {}

    export function addMock(url, data) {
    mocks[url] = data
    }

    export function enableMocking(state) {
    mockingEnabled = state
    }

    const isUrlMocked = url => url in mocks
    @@ -52,22 +57,4 @@ axios.interceptors.response.use(response => response, error => {
    return getMockResponse(error)
    }
    return Promise.reject(error)
    })

    // 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)
    }
    })
    25 changes: 25 additions & 0 deletions usage.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,25 @@
    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)
    }
  2. @cowboy cowboy created this gist Nov 8, 2017.
    73 changes: 73 additions & 0 deletions axios-mocking.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,73 @@
    const axios = require('axios')

    const mockingEnabled = true

    const mocks = {
    'https://dog.ceo/api/breeds/list/all': {data: {mock: 'dogs'}},
    'https://dog.ceo/404-page': {status: 404, message: 'whoops'}
    }

    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)
    })

    // 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)
    }