Test

react-redux mock example

react-redux 모듈을 모킹하기 위해 '/__mocks__' 디렉토리를 생성하고 'react-redux.js'를 생성한다.

// path: /__mocks__/react-redux.js

export const useDispatch = jest.fn();

export const useSelector = jest.fn((selector) => selector({}));

 

테스트의 대상이 되는 컴포넌트는 아래와 같다.

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

import { updateCheckedItem } from '../actions';

export default function App() {
  const dispatch = useDispatch();

  const { categories } = useSelector((state) => ({
    categories: state.categories,
  }));

  function handleClick(name, value) {
    dispatch(updateCheckedItem(name, value));
  }

  return (
    <Categories
      categories={categories}
      onClick={handleClick}
    />
  );
}

 

테스트는 'jest.mock('./moduleName')'을 통해 모듈을 모킹하고 usedispath와 useSelector를 아래와 같이 구현하도록 한다.

import { render, fireEvent } from '@testing-library/react';

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

import App from './App';

jest.mock('react-redux');

describe('App', () => {
  beforeEach(() => {
    jest.clearAllMocks();
  });

  const dispatch = jest.fn();

  useDispatch.mockImplementation(() => dispatch);

  useSelector.mockImplementation((selector) => selector({
    categories: [
      { id: 1, name: '기업1' },
      { id: 2, name: '기업2' },
      { id: 3, name: '기업3' },
    ],
  }));

  it('카테고리 목록을 보여준다', () => {
    const { getByText } = render((
      <App />
    ));

    expect(getByText('기업1')).toBeInTheDocument();
    expect(getByText('기업2')).toBeInTheDocument();
    expect(getByText('기업3')).toBeInTheDocument();
  });

  it('목록이 클릭되면 체크된 목록으로 변경한다', () => {
    const { getByText } = render((
      <App />
    ));

    fireEvent.click(getByText('기업1'));

    expect(dispatch).toBeCalledWith({
      type: 'updateCheckedItem',
      payload: {
        checkedCategory: {
          id: 1,
          text: '기업1',
        },
      },
    });
  });
});

'Test' 카테고리의 다른 글

Jest fetch mock example  (0) 2021.10.07
테스트 시나리오  (0) 2021.10.07