I want to test if a sidebar that I have created for navigation works or not, this is a simple example of what I have made
<ul>
<li><Link to="/location1">location 1</Link></li>
<li><Link to="/location2">location 2</Link></li>
</ul>
this is my test
const routerWrapper = ({children}) => <BrowserRouter>{children}</BrowserRouter>
// The first one runs fine
it('navigation to location 1' , () => {
render(<SideBar/> , {wrapper:routerWrapper})
// get the element and click on it
// check if title of page is correct
})
it('navigation to location 2' , () => {
render(<SideBar/> , {wrapper:routerWrapper})
// can't run because location is at /location1
})
When I test the navigation with RTL, first test runs fine, but after that the location remains at that directory for next test, how do I clear location after every test? or any suggestions how should I test navigation?
From the Checking location in tests doc:
- You can also use BrowserRouter if your test environment has the browser globals
window.locationandwindow.history(which is the default in Jest through JSDOM, but you cannot reset the history between tests).
- Instead of passing a custom route to MemoryRouter, you can use the base Router with a history prop from the history package
E.g.
index.tsx:
import React from 'react';
import { Link } from 'react-router-dom';
export function SideBar() {
return (
<ul>
<li>
<Link to="/location1">location 1</Link>
</li>
<li>
<Link to="/location2">location 2</Link>
</li>
</ul>
);
}
index.test.tsx:
import { fireEvent, render, screen } from '@testing-library/react';
import React from 'react';
import { createMemoryHistory } from 'history';
import { SideBar } from './';
import { Router } from 'react-router';
const createRouterWrapper = (history): React.ComponentType => ({ children }) => (
<Router history={history}>{children}</Router>
);
describe('SideBar', () => {
it('navigation to location 1', () => {
const history = createMemoryHistory();
render(<SideBar />, { wrapper: createRouterWrapper(history) });
fireEvent.click(screen.getByText('location 1'));
expect(history.location.pathname).toBe('/location1');
});
it('navigation to location 2', () => {
const history = createMemoryHistory();
render(<SideBar />, { wrapper: createRouterWrapper(history) });
fireEvent.click(screen.getByText('location 2'));
expect(history.location.pathname).toBe('/location2');
});
});
Test result:
PASS stackoverflow/70974339/index.test.tsx (8.701 s)
SideBar
✓ navigation to location 1 (40 ms)
✓ navigation to location 2 (4 ms)
-----------|---------|----------|---------|---------|-------------------
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s
-----------|---------|----------|---------|---------|-------------------
All files | 100 | 100 | 100 | 100 |
index.tsx | 100 | 100 | 100 | 100 |
-----------|---------|----------|---------|---------|-------------------
Test Suites: 1 passed, 1 total
Tests: 2 passed, 2 total
Snapshots: 0 total
Time: 9.232 s
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