не отправляется фиктивная диспетчерская функция - PullRequest
0 голосов
/ 13 марта 2019

Я пишу тест для создателя асинхронных действий, но столкнулся с проблемой, в которой говорится "Ожидается, что фиктивная функция была вызвана" с:

 [{"type": "GET_LOGIN_SUCCESS", "value": true}]

Но она не была вызвана.

Я не уверен, где именно проблема.Если кто-то может помочь, это будет высоко ценится.console screenshot

Вот мои actions.js

import { GET_LOGIN_SUCCESS } from './constants'

export const getLoginInfo = () => {
  return (dispatch, getState, axiosInstance) => {
    return axiosInstance.get('/api/isLogin.json')
          .then((res) => {
            dispatch({
              type: GET_LOGIN_SUCCESS,
              value: res.data.data.login
            })
            console.log('finishing dispatch')
          })
    }
}

actions.test.js

import { getLoginInfo } from './actions'
import { GET_LOGIN_SUCCESS } from './constants'


describe('async actions', () => {

    it('dispatches GET_LOGIN_SUCCESS when getting login finishes', () => {
        const axiosInstance = {
           get: jest.fn(() => Promise.resolve({ data: { data: {login : true }}}))
        }
        const dispatch = jest.fn()
        getLoginInfo()(dispatch, null, axiosInstance)
        expect(dispatch).toHaveBeenCalledWith({
            type: GET_LOGIN_SUCCESS,
            value: true
        })
    })
  })

1 Ответ

0 голосов
/ 13 марта 2019

Проблема в том, что шутка не может знать, что там задействовано асинхронное задание.Таким образом, в вашем случае вы создаете макет, который возвращает обещание, и отправка вызывается, когда обещание разрешено.Поскольку 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
        })
    })

Существует эпическая статья , которая описывает всю тему

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...