javascript - 如何使用 jest/enzyme 测试 useEffect 与 useDispatch Hook 的结合?

标签 javascript reactjs react-redux jestjs enzyme

如何测试挂载时 useEffect 是否通过 requestMovies 调用 dispatch

import { useDispatch } from 'react-redux';

export const requestMovies = page => ({
  type: MoviesTypes.REQUEST_MOVIES,
  page,
});

const MoviesShowcaseList = () => {
  const { page } = useShallowEqualSelector(state => state.movies);
  const dispatch = useDispatch();

  const fetchNextMoviesPage = () => {
    dispatch(requestMovies(page + 1));
  };

  useEffect(fetchNextMoviesPage, []);

  return (...);
};

最佳答案

首先,我们使用jest.mock获得 useDispatch 模拟:

import { useDispatch, useShallowEqualSelector } from 'react-redux';

jest.mock('react-redux');

其次,我们使用 mount 渲染元素(shallow does not run useEffect 因为 React 自己的浅层渲染器不这样做)。

const wrapper = mount(<MoviesShowcaseList />);

如果使用现代版本的 enzyme ,我们不需要对 act() 做任何额外的事情,因为它是 already in Enzyme .

最后我们检查 useDispatch 是否已被调用:

expect(useDispatch).toHaveBeenCalledWith({
  type: MoviesTypes.REQUEST_MOVIES,
  0,
});

全部在一起(带有模拟useShallowEqualSelector):

import { useDispatch } from 'react-redux';

jest.mock('react-redux');

it('loads first page on init', () => {
  useShallowEqualSelector.mockReturnValueOnce(0); // if we have only one selector
  const wrapper = mount(<MoviesShowcaseList />);
  expect(useDispatch).toHaveBeenCalledTimes(1);
  expect(useDispatch).toHaveBeenCalledWith({
    type: MoviesTypes.REQUEST_MOVIES,
    0,
  });
});

关于javascript - 如何使用 jest/enzyme 测试 useEffect 与 useDispatch Hook 的结合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57858836/

相关文章:

javascript - redux.js 中的 fetch(url) 使用错误的端口

javascript - Redux reducer : Filter Out Duplicate Objects?

javascript - CSS + Jquery - 如何获得这种效果? (当鼠标经过时弹出一个div)

javascript - 是否有一些可以使用 ajax 填充的好的 javascript 网格?

Javascript ontouchstart/move/end - 得到奇怪的结果

javascript - React redux 等待来自 api 的数据

react-redux - 如何在 redux-saga 中测试异步 axios 请求?

javascript - AWS Lambda 无法调用 Cognito Identity - IAM 角色

javascript - 如何在javascript中同时运行到if语句?

javascript - 获取 "undefined"试图创建一个函数