模拟调度功能未调用

时间:2019-03-13 08:51:37

标签: reactjs jestjs enzyme

我正在为异步操作创建者编写测试,但遇到一个问题,该问题指出“预期已调用模拟函数”

 [{"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 :(得分:0)

问题在于,开玩笑不知道其中涉及异步任务。因此,在您的情况下,您将创建一个返回承诺的模拟程序,并在解决承诺后调用dispatch。由于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-lives-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
        })
    })

有一个epic article描述了整个主题