Instead of mocking useParams
you can use <MemoryRouter initialEntries>
, for example:
MyComponent.js
import { useParams } from "react-router-dom";
function MyComponent() {
const { language } = useParams();
return (
<div>
<h2>My Component page</h2>
<p>language: {language}</p>
</div>
);
}
MyComponent.test.js
import { MemoryRouter } from "react-router-dom";
import { render, screen, fireEvent } from "@testing-library/react";
import "@testing-library/jest-dom";
import App from "./App";
test("Home: Go to `MyComponent: en`", async () => {
render(
<MemoryRouter initialEntries={["/"]}>
<App />
</MemoryRouter>
);
expect(screen.getByText("Home page")).toBeInTheDocument();
fireEvent.click(screen.getByText("My Component: en"));
expect(screen.getByText("language: en")).toBeInTheDocument();
expect(screen.queryByText("language: fr")).not.toBeInTheDocument();
});
test("MyComponent: en", async () => {
render(
<MemoryRouter initialEntries={["/myComponent/en"]}>
<App />
</MemoryRouter>
);
expect(screen.getByText("language: en")).toBeInTheDocument();
});
test("MyComponent: fr", async () => {
render(
<MemoryRouter initialEntries={["/myComponent/fr"]}>
<App />
</MemoryRouter>
);
expect(screen.getByText("language: fr")).toBeInTheDocument();
});
Online demo
