I have header component like below:
import { useLocation } from "react-router-dom";  const Header = () => {    let route = useLocation().pathname;     return route === "/user" ? <ComponentA /> : <ComponentB />; } How will you mock this useLocation() to get the path as user?
I cant simply call the Header component as below in my test file as I am getting an error:
TypeError: Cannot read property 'location' of undefined at useLocation
describe("<Header/>", () => {     it("call the header component", () => {         const wrapper = shallow(<Header />);         expect(wrapper.find(ComponentA)).toHaveLength(1);     }); }); I have tried looking similar to the link How to test components using new react router hooks? but it didnt work.
I have tried like below:
const wrapper = shallow(       <Provider store={store}>         <MemoryRouter initialEntries={['/abc']}>           <Switch>             <AppRouter />           </Switch>         </MemoryRouter>       </Provider>,     );     jestExpect(wrapper.find(AppRouter)       .dive()       .find(Route)       .filter({path: '/abc'})       .renderProp('render', { history: mockedHistory})       .find(ContainerABC)     ).toHaveLength(1); from the link Testing react-router with Shallow rendering but it didnt work.
Please let me know.
Thanks in advance.
If you need to access the path, use window. location. pathname . The pathname property returns a string containing the path of the URL for the location.
To mock the useHistory hook in Jest, we can call jest. mock with a function to return the return value of useHistory . jest. mock("react-router-dom", () => ({ useHistory: () => ({ push: jest.
Mock functions allow you to test the links between code by erasing the actual implementation of a function, capturing calls to the function (and the parameters passed in those calls), capturing instances of constructor functions when instantiated with new , and allowing test-time configuration of return values.
I found that I can mock the React Router hooks like useLocation using the following pattern:
import React from "react" import ExampleComponent from "./ExampleComponent" import { shallow } from "enzyme"  jest.mock("react-router-dom", () => ({   ...jest.requireActual("react-router-dom"),   useLocation: () => ({     pathname: "localhost:3000/example/path"   }) }));  describe("<ExampleComponent />", () => {   it("should render ExampleComponent", () => {     shallow(<ExampleComponent/>);   }); }); If you have a call to useLocation in your ExampleComponent the above pattern should allow you to shallow render the component in an Enzyme / Jest test without error. Hope that helps!
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With