jestjs - 如何为每个测试模拟不同的 useLocation 值?

标签 jestjs react-hooks react-router-dom react-component

我的 React 组件应该根据当前位置对状态进行一些更改。

有自定义钩子(Hook),在组件加载时调用。 在 Hook 中检查 useLocation().pathname 以及 switch/case 中的结果是否正确更改。

这可以在一个文件/描述中进行 Jest 测试吗? 我尝试了 jest.mock useLocation 但我无法在 Jest describe...

这是模拟,目前不在描述范围内 - 这有效,但不能在测试之间更改:

const mockUseLocation = () => {
    jest.mock('react-router-dom', () => ({
        useLocation: jest.fn().mockReturnValue({
            pathname: '/val1'
        })
    }))
};

如何测试所有 switch/case 分支?

switch (pathname) {
   case 'val1':
       return 100;
   case 'val2':
       return 200;
   ...
   ...
}

最佳答案

为了摆脱@skyboyer 的回答,我使用 renderHook 使它运行良好

第一个参数是你要测试的钩子(Hook),第二个参数是我包装的包装器 <MemoryRouter> , <Route>周围children Prop 。

// test.js
import React, { FC } from 'react';
import { MemoryRouter, Route } from 'react-router-dom';
import { renderHook } from '@testing-library/react-hooks';

it('returns value from url query', () => {

    const wrapper: FC = ({ children }) => (
      <MemoryRouter initialEntries={[`/?user=authorized`]}>
        <Route path="*" />
        {children}
      </MemoryRouter>
    );
    
    const { result } = renderHook(() => useLocation(), { wrapper });

    expect(result.current).toBe('authorized');
  });

关于jestjs - 如何为每个测试模拟不同的 useLocation 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61441886/

相关文章:

javascript - 如何测试函数在 react jest 中被调用?

reactjs - 如何修复 "Warning: useLayoutEffect does nothing on the server"?

reactjs - React/React Native + enzyme : How to test if a component renders it's children?

javascript - 在 react router v6 中使用导航功能时如何传递数据

reactjs - React 与链接相关的路由器错误

typescript - Jest 和 TypeScript 的不完整 stub

javascript - 如何仅在 setstate 之后渲染页面

javascript - 无效的 Hook 调用。钩子(Hook)只能在使用 react-apollo 的函数组件内部调用

javascript - React 在 props 改变时取消 Promise

reactjs - 如何使用默认的提交验证将链接从react router dom添加到提交按钮