在使用 Jest 和 React 测试 React Router 的 Router.push
方法时,您通常会使用 react-router-dom
提供的 MemoryRouter
来模拟路由环境。以下是一个示例,展示如何测试组件中的 Router.push
调用。
假设我们有一个简单的组件,它在按钮点击时使用 Router.push
导航到另一个页面。
// MyComponent.js
import React from 'react';
import { useHistory } from 'react-router-dom';
const MyComponent = () => {
const history = useHistory();
const handleClick = () => {
history.push('/new-route');
};
return (
<div>
<button onClick={handleClick}>Go to New Route</button>
</div>
);
};
export default MyComponent;
接下来,我们将编写测试代码来验证按钮点击时是否调用了 history.push
。
// MyComponent.test.js
import React from 'react';
import { render, fireEvent } from '@testing-library/react';
import { MemoryRouter } from 'react-router-dom';
import MyComponent from './MyComponent';
test('navigates to new route on button click', () => {
const { getByText } = render(
<MemoryRouter>
<MyComponent />
</MemoryRouter>
);
// 获取按钮并触发点击事件
const button = getByText('Go to New Route');
fireEvent.click(button);
// 验证 history.push 被调用
// 由于我们没有直接访问 history 对象,我们可以通过模拟 history 对象来验证
// 这里我们可以使用 jest.fn() 来模拟 history.push
const history = {
push: jest.fn(),
};
// 重新渲染组件并传入模拟的 history
const { getByText: getByTextWithHistory } = render(
<MemoryRouter>
<MyComponent history={history} />
</MemoryRouter>
);
fireEvent.click(getByTextWithHistory('Go to New Route'));
// 验证 history.push 被调用
expect(history.push).toHaveBeenCalledWith('/new-route');
});
MyComponent
使用 useHistory
钩子来获取 history
对象,并在按钮点击时调用 history.push
。
MemoryRouter
包裹组件,以便在测试中模拟路由。@testing-library/react
的 render
和 fireEvent
方法来渲染组件并模拟用户交互。jest.fn()
创建一个模拟的 history
对象,并在测试中验证 push
方法是否被调用。history
对象,因为 useHistory
钩子会自动从 Router
中获取。useNavigate
钩子来替代 useHistory
,并相应地调整测试代码。通过上述步骤,您可以使用 Jest 和 React 测试 Router.push
的调用。确保在测试中模拟路由环境,以便正确验证组件的行为。
领取专属 10元无门槛券
手把手带您无忧上云