Проблема в том, что шутка не может знать, что там задействовано асинхронное задание.Таким образом, в вашем случае вы создаете макет, который возвращает обещание, и отправка вызывается, когда обещание разрешено.Поскольку JavaScript является однопоточным, он сначала оценивает код в тесте, а все асинхронные задачи выполняются впоследствии.Таким образом, вы должны сообщить шутку об обещании, используя async/await
:
describe('async actions', () => {
it('dispatches GET_LOGIN_SUCCESS when getting login finishes', async() => {
const p = Promise.resolve({ data: { data: {login : true }}}))
const axiosInstance = {
get: jest.fn(() => p
}
const dispatch = jest.fn()
getLoginInfo()(dispatch, null, axiosInstance)
await p // even it sounds not very logically you need to wait here
expect(dispatch).toHaveBeenCalledWith({
type: GET_LOGIN_SUCCESS,
value: true
})
})
Как указывает @ brian-Life-outdoors, getLoginInfo
возвращает обещание также, так чтоВы также можете просто дождаться результата звонка:
it('dispatches GET_LOGIN_SUCCESS when getting login finishes', async() => {
const axiosInstance = {
get: jest.fn(() => Promise.resolve({ data: { data: {login : true }}}))
}
const dispatch = jest.fn()
await getLoginInfo()(dispatch, null, axiosInstance)
expect(dispatch).toHaveBeenCalledWith({
type: GET_LOGIN_SUCCESS,
value: true
})
})
Существует эпическая статья , которая описывает всю тему