Monday, May 20, 2024
 Popular · Latest · Hot · Upcoming
96
rated 0 times [  102] [ 6]  / answers: 1 / hits: 5476  / 4 Years ago, wed, may 20, 2020, 12:00:00

About:



Hey there, at the moment I am trying to write tests with jest and the react testing library for my react components. I also use react-router.



The Problem:



I want to check if the app routes to the right component when the path changes without interacting with the single components.



So for example, if the current pathname is /impressum I want to have a Snapshot from just the Impressum page.



I cannot figure out how to pass the path to <App> so that only one Route is displayed.



The component I am trying to test:



import React from 'react'
import { BrowserRouter as Router, Switch, Route } from react-router-dom

import WeatherPage from ../WeatherPage/WeatherPage.js
import AddWeatherPage from ../AddWeatherPage/AddWeatherPage.js
import WeatherDetailsPage from ../WeatherDetailsPage/WeatherDetailsPage.js
import DeleteWeatherPage from '../DeleteWeatherPage/DeleteWeatherPage.js'
import ImpressumPage from '../ImpressumPage/ImpressumPage.js'

class App extends React.Component {
render() {
return (
<Router>
<Switch>
<Route path=/weatherDetails component={WeatherDetailsPage} />
<Route path=/addWeather component={AddWeatherPage} />
<Route path=/deleteWeather component={DeleteWeatherPage} />
<Route path=/impressum component={ImpressumPage} />
<Route path=/ component={WeatherPage} />
</Switch>
</Router>
);
}
}

export default App


What i tried:




  1. So I already tried to implement the following example: https://testing-library.com/docs/example-react-router


  2. I also tried to wrap the <App> component with <MemoryRouter> from -> import { MemoryRouter } from 'react-router'; and push the route: https://reacttraining.com/react-router/web/guides/testing


  3. I also tried to wrap the <App> component with <Router> from -> import { Router } from react-router-dom; and push the history object.




My Basic Testing Code



Following you can see the code I use for testing, I made some changes while testing but this basic part remained all the time.



describe(snapshot-test, () => {
it(renders component, () => {
const { asFragment } = render(
<App></App>
)

expect(asFragment()).toMatchSnapshot()
})
})

More From » reactjs

 Answers
0

I just found a solution.



I had to mock Router to be a div and contains its children code.
This works the following way:



You need the folder __mocks__/react-router-dom.js which contains the following code:



import React from 'react';

const reactRouterDom = require(react-router-dom)
reactRouterDom.BrowserRouter = ({children}) => <div>{children}</div>

module.exports = reactRouterDom


Now you can use the MemoryRouter to define the path which the Route should point to.



App.test.js:



import React from react;
import { render } from @testing-library/react;
import { MemoryRouter } from 'react-router-dom';
import App from './App';


describe(unit-test, () => {
it(renders the right component with following path '/impressum', () => {
const { getByTestId } = render(
<MemoryRouter initialEntries={['/impressum']}>
<App></App>
</MemoryRouter>
)

let impressumPage = getByTestId(impressum-page)

expect(impressumPage).toBeInTheDocument()
})
})


Also visit the following link, I got the solution from there.
https://medium.com/@antonybudianto/react-router-testing-with-jest-and-enzyme-17294fefd303


[#3748] Monday, May 18, 2020, 4 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
sandra

Total Points: 708
Total Questions: 100
Total Answers: 84

Location: Bosnia and Herzegovina
Member since Thu, Jun 24, 2021
3 Years ago
sandra questions
;