Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do you mock useLocation() pathname using shallow test enzyme Reactjs?

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.

like image 734
purmo037 Avatar asked Jan 28 '20 12:01

purmo037


People also ask

How do you get the pathname in react?

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.

How do you use mock useHistory hook in jest?

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.

What is mocking in react testing?

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.


1 Answers

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!

like image 164
jacobedawson Avatar answered Sep 26 '22 19:09

jacobedawson