我正在使用jest
和axios-mock-adapter
测试redux
异步操作创建器中的axios
API调用。
当我使用axios.create()
创建的axios
示例时,我无法使它们工作:
import axios from 'axios';
const { REACT_APP_BASE_URL } = process.env;
export const ajax = axios.create({
baseURL: REACT_APP_BASE_URL,
});
我会在我的async action creator
中使用它,例如:
import { ajax } from '../../api/Ajax'
export function reportGet(data) {
return async (dispatch, getState) => {
dispatch({ type: REQUEST_TRANSACTION_DATA })
try {
const result = await ajax.post(
END_POINT_MERCHANT_TRANSACTIONS_GET,
data,
)
dispatch({ type: RECEIVE_TRANSACTION_DATA, data: result.data })
return result.data
} catch (e) {
throw new Error(e);
}
}
}
下面是我的测试文件:
import {
reportGet,
REQUEST_TRANSACTION_DATA,
RECEIVE_TRANSACTION_DATA,
} from '../redux/TransactionRedux'
import configureMockStore from 'redux-mock-store'
import thunk from 'redux-thunk'
import { END_POINT_MERCHANT_TRANSACTIONS_GET } from 'src/utils/apiHandler'
import axios from 'axios'
import MockAdapter from 'axios-mock-adapter'
const middlewares = [thunk]
const mockStore = configureMockStore(middlewares)
const store = mockStore({ transactions: {} })
test('get report data', async () => {
let mock = new MockAdapter(axios)
const mockData = {
totalSalesAmount: 0
}
mock.onPost(END_POINT_MERCHANT_TRANSACTIONS_GET).reply(200, mockData)
const expectedActions = [
{ type: REQUEST_TRANSACTION_DATA },
{ type: RECEIVE_TRANSACTION_DATA, data: mockData },
]
await store.dispatch(reportGet())
expect(store.getActions()).toEqual(expectedActions)
})
我只得到一个操作Received: [{"type": "REQUEST_TRANSACTION_DATA"}]
,因为ajax.post
有一个错误。
我已经尝试了许多方法来嘲笑axios.create
无济于事,没有真正知道我在做什么..任何帮助是赞赏.
7条答案
按热度按时间3z6pesqy1#
好的,我知道了。下面是我是如何修复它的!我最终做了没有任何
axios
的模拟库!在
src/__mocks__
中为axios
创建模拟:然后在测试文件中,要点看起来像这样:
zc0qhyus2#
如果您需要创建Jest测试,在特定测试中使用
create
模拟axios
(并且不需要所有测试用例的模拟axios,如其他答案所述),您还可以用途:下面是指向同一个示例的链接,该示例在Jest中模拟Axios,但没有
create
。lnxxn5zx3#
下面是我对axios模拟
dzhpxtsq4#
在你的mockAdapter中,你模拟了错误的示例,你应该模拟 AJAX ,像这样,
const mock = MockAdapter(ajax)
这是因为你现在模拟的不是axios
示例,而是ajax
,因为它是你用来发送请求的,也就是说,你在做export const ajax = axios.create...
的时候创建了一个叫ajax的axios示例,所以既然你在代码中做的是const result = await ajax.post
,应该模拟axios的ajax
示例,而不是axios
。zpgglvta5#
我有另一个办法。
9q78igpj6#
另一种方法:添加这个文件到
src/__mocks__
文件夹hvvq6cgz7#
下面的代码可以工作!