że rozwiązano to w różny sposób: wstrzyknięcie Axios jako zależność działania. Preferuję to podejście w stosunku do "zmieniających" zależności.
Użyłem tego samego podejścia do testowania komponentów połączonych z redukcją. Podczas eksportu działań eksportuję dwie wersje: jedną z (do użycia dla komponentów) i jedną bez (do testowania) zależności wiązania.
Oto jak mój plik actions.js wygląda następująco:
import axios from 'axios'
export const loadDataRequest =() => {
return {
type: 'LOAD_DATA_REQUEST'
}
}
export const loadDataError =() => {
return {
type: 'LOAD_DATA_ERROR'
}
}
export const loadDataSuccess = (data) =>{
return {
type: 'LOAD_DATA_SUCCESS',
data
}
}
export const loadData = (axios) => {
return dispatch => {
dispatch(loadDataRequest())
axios
.get('http://httpbin.org/ip')
.then(({data})=> dispatch(loadDataSuccess(data)))
.catch(()=> dispatch(loadDataError()))
}
}
export default {
loadData: loadData.bind(null, axios)
}
Następnie testuje z jest (actions.test.js):
import { loadData } from './actions'
describe('testing loadData',()=>{
test('loadData with success', (done)=>{
const get = jest.fn()
const data = {
mydata: { test: 1 }
}
get.mockReturnValue(Promise.resolve({data}))
let callNumber = 0
const dispatch = jest.fn(params =>{
if (callNumber===0){
expect(params).toEqual({ type: 'LOAD_DATA_REQUEST' })
}
if (callNumber===1){
expect(params).toEqual({
type: 'LOAD_DATA_SUCCESS',
data: data
})
done()
}
callNumber++
})
const axiosMock = {
get
}
loadData(axiosMock)(dispatch)
})
})
Podczas korzystania działania wewnątrz komponentu importować
import Actions from './actions'
I: wszystko wysyłka:
Actions.loadData() // this is the version with axios binded.
dziękuję Dan! bardzo czyste! –
Należy również pamiętać, że 'createMockStore' został opublikowany jako pakiet: https://github.com/arnaudbenard/redux-mock-store –
Możesz testować akcje asynchroniczne synchronicznie za pomocą https://github.com/wix/redux -testkit – yedidyak