如何:通过配置打字机时模拟axios

时间:2019-07-10 20:08:01

标签: typescript mocking jestjs axios

傻问题。使用配置约定(axios(passAConfigObj))时,我无法模拟axios。当它是axios.get或axios.post时,我没有任何问题。不尝试引入一个库,因为我觉得可以做到这一点。

我尝试模拟将要使用的请求方法(axios.post)。我尝试模拟axios并给它一个返回值,但是想要一个'AxiosPromise'。

const mockedAxios = mocked(axios)

mockedAxios.mockImplementationOnce(() => Promise.resolve(2))

错误:TS2322: Type 'Promise<number>' is not assignable to type 'AxiosPromise<any>'

//

// auth.spec.ts
import { getAuthToken } from '../auth'

import axios from 'axios'
import { mocked } from 'ts-jest/utils'

jest.mock('axios')

describe('getAuthToken', () => {
  const mockedAxiosPost = mocked(axios)

  it('should return ', () => {
    mockedAxiosPost.mockImplementationOnce(() =>
      Promise.resolve({ data: 'response.data' })
    )

    const authToken = getAuthToken()

    expect(authToken).toEqual()
    expect(mockedAxiosPost).toHaveBeenCalledTimes(1)
    expect(mockedAxiosPost).toHaveBeenCalledWith()

  })
})
// auth.ts
import axios from 'axios'

export const getAuthToken = () => {

  const options = {
    url: `url`,
    method: 'POST',
    headers: {
      Authorization: ''
      'Content-Type': '',
    },
    data: {},
  }

  return axios(options)
    .then(response => {
      return response
    })
    .catch(error => {
      console.log(error.response)
    })
}

我希望通过配置的axios可以在内部调用axios.post,从而可以正常工作/通过我的测试。

我还有axios.post和axios.get的其他实现都可以使用这种测试样式,所以这不是问题。显然,我可以更改代码以使用axios.post,但在这一点上,我比什么都好奇。在此先感谢:)

1 个答案:

答案 0 :(得分:0)

这已经有一年了,在尝试解决相同的问题时,我偶然发现了这个线程。

我挠了一下头,但最终我设法弄破了它。

有一些上下文可以更好地理解我是如何解决的:

我嘲笑axiosjest一起使用,并且在项目中使用Typescript

也就是说,这就是我最终要做的:

__ mocks __ / axios.ts:

import { AxiosResponse } from 'axios';

const axiosResponse: AxiosResponse = {
  data: { falseProp: 'value' },
  status: 200,
  statusText: 'OK',
  config: {},
  headers: {},
};

export default {
  create: jest.fn((config) => {
     const wrapFunction = (param: any) => {
      return Promise.resolve(axiosResponse)
     }

     return wrapFunction
  })
};

这是我在尝试测试的代码中使用axios的方式的示例:

src / MyRequestClass.ts:

import axios, { AxiosInstance, AxiosError } from 'axios'

const axiosInstance = axios.create({
  baseURL: 'https://fake-api-url',
  headers: {
      common: {
          Authorization: authToken
      }
  }
})

const request = {
  method: 'GET',
  url: 'https://fake-api-url/endpoint',
  params: {},
  data: {},
  headers: {}
}

const response = await axiosInstance(request)

从本质上讲,我所做的就是使它create返回一个function来接收您提到的config对象(在我的情况下为request对象),总是解析Promise

当然,您也可以这样做,根据测试用例,Promise会失败。

希望这对其他人有帮助!