How to resolve unique keys required error when using in a test

How to resolve unique keys required error when using <MemoryRouter /> in a test



I'm writing snapshot tests for a React application, and I'm finding that when I write tests using <MemoryRouter/> in them, it throws a warning that I need to have a unique key prop.


<MemoryRouter/>



When I looked at the react-router documentation, there was no mention of needing a key, and I haven't found a solution to this particular issue elsewhere.



This is what my test looks like:


import React from 'react';
import ReactDOM from 'react-dom';
import mount, shallow from 'enzyme';
import renderer from 'react-test-renderer';
import MemoryRouter from 'react-router'
import Navbar from '../Navbar';

it('renders a snapshot', () =>
const wrapper = mount(
<MemoryRouter
initialEntries=['/' ]
initialIndex=1
>
<Navbar/>
</MemoryRouter>
)
const tree = renderer.create(wrapper).toJSON();
expect(tree).toMatchSnapshot();
);

it('renders without crashing', () =>
shallow(<Navbar />);
);



And here is the error I'm getting:


Warning: Each child in an array or iterator should have a unique "key" prop.




1 Answer
1



Any reason you're suing mount instead of shallow?


mount


shallow



I'm sort of a newbie... seriously asking...



I was running into this same problem with shallow and the solution I came up with...


shallow



(if using shallow is justifiable... )


shallow



try this:


`
<div key=1> // this is the dude here
<MemoryRouter>
<App />
</MemoryRouter>
</div>`



I'm assuming MemoryWrapper ignores unfamiliar props.



I would like to know if this is a decent solution or if there's something else we're (I'm) missing.



interesting console play... it looks like mount hits some lifecycles more than once, so the key wouldn't be unique after round 1, but not sure how you would pass that.


mount



App.js


`class App extends Component
componentWillMount()
console.log('componentWillMount');

componentDidMount()
console.log('componentDidMount');

componentWillReceiveProps()
console.log('componentWillReceiveProps');

shouldComponentUpdate()
console.log('shouldComponentUpdate');
return true;

componentWillUpdate()
console.log('componentWillUpdate');

componentDidUpdate()
console.log('componentDidUpdate');

componentWillUnmount()
console.log('componentWillUnmount');

render()
return (
<div className='App-main'>
<Route path='/' component=Header/>
<Route path='/' component=About />
</div>
)

`



App.test.js w/ mount


mount




it('renders App without crashing', () => {
const appWrapper =
mount(
<div key=1>
<MemoryRouter>
<App />
</MemoryRouter>
</div>
);



it('renders App without crashing', () => {
const appWrapper =
mount(
<div key=1>
<MemoryRouter>
<App />
</MemoryRouter>
</div>
);



console.logs from app.js with MOUNT


MOUNT


`console.log src/App.js:17
componentWillMount

console.log src/App.js:20
componentDidMount

console.error node_modules/fbjs/lib/warning.js:33
Warning: Each child in an array or iterator should have a unique "key" prop. See https://some-dumb-shit.org for more information.

console.log src/App.js:17
componentWillMount

console.log src/App.js:20
componentDidMount

console.log src/App.js:36
componentWillUnmount`



App.test.js w/ SHALLOW


SHALLOW




it('renders App without crashing', () => {
const appWrapper =
shallow(
<div key=1>
<MemoryRouter>
<App />
</MemoryRouter>
</div>
);



it('renders App without crashing', () => {
const appWrapper =
shallow(
<div key=1>
<MemoryRouter>
<App />
</MemoryRouter>
</div>
);



console.logs from app.js with SHALLOW


SHALLOW


`console.log src/App.js:17
componentWillMount

console.log src/App.js:20
componentDidMount

console.log src/App.js:36
componentWillUnmount`



no error. I'm not sure if my answer is correct in that maybe you were using mount when you should have used shallow? But, there's got to be some purpose for mount, and some way to rid the error.






By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.