首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >测试react-redux useSelector

测试react-redux useSelector
EN

Stack Overflow用户
提问于 2020-02-01 05:29:35
回答 3查看 13.3K关注 0票数 14

我有一个react应用程序,它使用react-redux,useSelector从存储中获取数据。react组件具有

代码语言:javascript
复制
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模拟存储,然后将该组件包装在provider组件下。2)在jest中模拟useSelector方法

代码语言:javascript
复制
jest.mock('react-redux', () => ({
  useSelector: () => ({
  })
});

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

EN

回答 3

Stack Overflow用户

发布于 2020-04-01 23:00:49

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

代码语言:javascript
复制
const nameSelector = state => state.data.name;
const dobSelector = state => state.data.dob;

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

代码语言:javascript
复制
jest.mock('react-redux', () => ({
  useSelector: jest.fn().mockImplementation(selector => selector()),
}));

和模拟选择器,例如:

代码语言:javascript
复制
jest.mock('./selectors.js', () => ({
  nameSelector: jest.fn().mockReturnValue("myTestName"),
  dobSelector: jest.fn().mockReturnValue("myTestDob"),
}));
票数 16
EN

Stack Overflow用户

发布于 2020-02-17 17:27:49

试试这个:

代码语言:javascript
复制
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));
}

}
票数 1
EN

Stack Overflow用户

发布于 2021-04-02 06:54:08

尝试以下方法:

代码语言:javascript
复制
jest.mock('react-redux', () => ({
  useSelector: jest.fn().mockImplementation(func => func(store))
});

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

代码语言:javascript
复制
jest.mock('react-redux', () => {
  const store = {
    data: {
      name: { 
           ...
      },
      dob: {
           ...
      }
    }
  };
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60011473

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档