reactjs - 测试 react-redux useSelector

标签 reactjs unit-testing react-redux react-hooks

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

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() 在我看来并不正确。

最佳答案

我建议采用不同的方法 - 将您的选择器提取到单独的文件中,例如文件选择器.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"),
}));

关于reactjs - 测试 react-redux useSelector,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60011473/

相关文章:

javascript - 未处理的拒绝(类型错误): Cannot read property 'map' of undefined

javascript - 如何在持久的 NextJS React Audio Player 组件中捕获 Mobx 可观察更新?

c++ - 使用关键字公开 protected 重载方法

java - org.springframework.web.client.HttpClientErrorException : 400 null

c++ - 在 BOOST_CHECK_EQUAL 期间隐藏 cerr 输出

reactjs - 如何同步Redux和Relay?

javascript - 如何在动态路线上的 nextjs 应用程序中添加动态图标

javascript - 当状态更新时,我失去了对动态创建的 jsx 输入的关注

javascript - 使用 AntDesign 列表和 Firebase Firestore 数据使用react

reactjs - MapStateToProps 给我未定义的错误