傻问题。使用配置约定(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,但在这一点上,我比什么都好奇。在此先感谢:)
答案 0 :(得分:0)
这已经有一年了,在尝试解决相同的问题时,我偶然发现了这个线程。
我挠了一下头,但最终我设法弄破了它。
有一些上下文可以更好地理解我是如何解决的:
我嘲笑axios
与jest
一起使用,并且在项目中使用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
会失败。
希望这对其他人有帮助!