首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何使用Jest/React测试Router.push

在使用 Jest 和 React 测试 React Router 的 Router.push 方法时,您通常会使用 react-router-dom 提供的 MemoryRouter 来模拟路由环境。以下是一个示例,展示如何测试组件中的 Router.push 调用。

示例组件

假设我们有一个简单的组件,它在按钮点击时使用 Router.push 导航到另一个页面。

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

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

解释

  1. 组件MyComponent 使用 useHistory 钩子来获取 history 对象,并在按钮点击时调用 history.push
  2. 测试
    • 使用 MemoryRouter 包裹组件,以便在测试中模拟路由。
    • 使用 @testing-library/reactrenderfireEvent 方法来渲染组件并模拟用户交互。
    • 通过 jest.fn() 创建一个模拟的 history 对象,并在测试中验证 push 方法是否被调用。

注意事项

  • 在实际的测试中,您可能不需要手动传递 history 对象,因为 useHistory 钩子会自动从 Router 中获取。
  • 如果您使用的是 React Router v6,您可能需要使用 useNavigate 钩子来替代 useHistory,并相应地调整测试代码。

总结

通过上述步骤,您可以使用 Jest 和 React 测试 Router.push 的调用。确保在测试中模拟路由环境,以便正确验证组件的行为。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

领券