在使用 Jest 进行单元测试时,如果要测试的组件中使用了 useHistory
这个 hook 从 react-router-dom,我们通常需要对它进行 mock,以便能够控制和测试与路由相关的逻辑。下面是对 useHistory
进行 mock 的步骤和示例:
步骤 1: 设置 Jest 测试文件
首先,你需要在你的 Jest 测试文件中引入必要的模块,并准备好你的组件。
javascriptimport React from 'react'; import { render, fireEvent } from '@testing-library/react'; import { Router } from 'react-router-dom'; import { createMemoryHistory } from 'history'; import MyComponent from './MyComponent'; // 假设这是你需要测试的组件
步骤 2: Mock useHistory
接下来,我们使用 mock 来模拟 useHistory
。这里有两种常见的方式来实现:
方式一:直接在测试中改写 useHistory
你可以在你的测试文件中直接覆盖 useHistory
。
javascriptimport { useHistory } from 'react-router-dom'; jest.mock('react-router-dom', () => ({ ...jest.requireActual('react-router-dom'), useHistory: jest.fn(), }));
然后在具体的测试用例中,你可以定义 useHistory
应该如何表现:
javascripttest('should navigate to home page on button click', () => { const historyMock = { push: jest.fn(), location: {}, listen: jest.fn() }; useHistory.mockReturnValue(historyMock); const { getByText } = render(<MyComponent />); fireEvent.click(getByText('Go Home')); expect(historyMock.push).toHaveBeenCalledWith('/home'); });
方式二:使用 Router 和 createMemoryHistory
另一种方式是使用 Router
和 createMemoryHistory
来包裹你的组件,这样可以更灵活地控制路由的状态。
javascripttest('should navigate on button click', () => { const history = createMemoryHistory(); const { getByText } = render( <Router history={history}> <MyComponent /> </Router> ); fireEvent.click(getByText('Go Home')); expect(history.location.pathname).toBe('/home'); });
步骤 3: 执行和验证
无论选择哪种方式,最终你都需要执行你的测试命令来运行测试,并验证它们是否按预期工作。你可以使用 npm test
或你配置的任何特定命令来运行 Jest。
总结
Mocking useHistory
可以通过直接 mock useHistory
或使用 Router
和 createMemoryHistory
这两种方式来实现。选择哪种方式取决于个人或团队对测试策略的偏好。如果你的组件深度依赖于路由行为,使用 Router
和 createMemoryHistory
可能会更合适。