繁体   English   中英

测试 react-redux useSelector

[英]testing react-redux useSelector

我有一个反应应用程序,它使用 react-redux,useSelector 从商店获取数据。 反应组件有

function PersonDataView() {
  const name= useSelector(state => state.data.name)
  const dob= useSelector(state => state.data.dob)
  const dispatch = useDispatch()
  const show= () => dispatch({type: 'SHOW'})
  const remove= () => dispatch({type: 'REMOVE'})
  return (
    <div>
      <h2>Person Details</h2>
     <div>
      <button onClick={show}>Show</button>
      <span aria-label="name">{name}</span>
      <span aria-label="dob">{dob}</span>
      <button onClick={remove}>Remove</button>
     </div>
   </div>
  )
}

我正在使用 react-testing-library 来测试这个组件。 是否有任何 API 可以让我们更轻松地测试这些组件。 我知道测试这些的两种方法:1)我可以使用 redux-mock-store 模拟商店,然后将此组件包装在提供程序组件下。 2) 在 jest 中模拟 useSelector 方法

jest.mock('react-redux', () => ({
  useSelector: () => ({
  })
});

但是使用 jest mock 的问题是在多个选择器的情况下,所有 useSelectors 将返回相同的模拟值。 使用玩笑的方式, jest.fn().mockReturnValueOnce() 在我看来并不正确。

我建议采用不同的方法 - 将您的选择器提取到单独的文件中,例如文件 selectors.js:

const nameSelector = state => state.data.name;
const dobSelector = state => state.data.dob;

然后在测试中,您可以模拟 useSelector 如下:

jest.mock('react-redux', () => ({
  useSelector: jest.fn().mockImplementation(selector => selector()),
}));

并分别模拟选择器,例如:

jest.mock('./selectors.js', () => ({
  nameSelector: jest.fn().mockReturnValue("myTestName"),
  dobSelector: jest.fn().mockReturnValue("myTestDob"),
}));

尝试这个:

jest.mock('react-router');
const useSelectorMock = useSelector as any;

describe('something', () {

test('name', () => {

// Use this for each useSelector call:
useSelectorMock.mockImplementationOnce(jest.fn(() => returnValue as yourType));
}

}

试试这个方法:

jest.mock('react-redux', () => ({
  useSelector: jest.fn().mockImplementation(func => func(store))
});

您还应该在此处添加一层:

jest.mock('react-redux', () => {
  const store = {
    data: {
      name: { 
           ...
      },
      dob: {
           ...
      }
    }
  };

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM