test route react react-router jestjs react-router-v4

react router - test - Uso de Jest para probar un enlace desde react-router v4



test routes jest (4)

Estoy usando jest para probar un componente con un <Link> de react-router v4.

Recibo una advertencia de que <Link /> requiere el contexto de un componente <Router /> enrutador de reacción.

¿Cómo puedo simular o proporcionar un contexto de enrutador en mi prueba? (Básicamente, ¿cómo resuelvo esta advertencia?)

Link.test.js

import React from ''react''; import renderer from ''react-test-renderer''; import { Link } from ''react-router-dom''; test(''Link matches snapshot'', () => { const component = renderer.create( <Link to="#" /> ); let tree = component.toJSON(); expect(tree).toMatchSnapshot(); });

La advertencia cuando se ejecuta la prueba:

Warning: Failed context type: The context `router` is marked as required in `Link`, but its value is `undefined`.


Las soluciones anteriores tienen un defecto predeterminado común:

No se puede acceder a la instancia de su componente! Porque el componente StaticRouter o StaticRouter envolvió su componente.

Así que lo mejor para resolver este problema es simular un contexto de enrutador, codifique de la siguiente manera:

import { configure, mount } from ''enzyme''; import Adapter from ''enzyme-adapter-react-16''; describe(''YourComponent'', () => { test(''test component with react router'', () => { // mock react-router context to avoid violation error const context = { childContextTypes: { router: () => void 0, }, context: { router: { history: createMemoryHistory(), route: { location: { hash: '''', pathname: '''', search: '''', state: '''', }, match: { params: {}, isExact: false, path: '''', url: '''' }, } } } }; // mount component with router context and get component''s instance const wrapper = mount(<YourComponent/>, context); // access your component as you wish console.log(wrapper.props(), wrapper.state()) }); beforeAll(() => { configure({ adapter: new Adapter() }); }); });


Puede envolver su componente en la prueba con el StaticRouter para obtener el contexto del enrutador en su componente:

import React from ''react''; import renderer from ''react-test-renderer''; import { Link } from ''react-router-dom''; import { StaticRouter } from ''react-router'' test(''Link matches snapshot'', () => { const component = renderer.create( <StaticRouter location="someLocation" context={context}> <Link to="#" /> </StaticRouter> ); let tree = component.toJSON(); expect(tree).toMatchSnapshot(); });

Echa un vistazo a los documentos del enrutador de reacción sobre las pruebas


Tenía el mismo problema y el uso de StaticRouter aún requeriría el context que necesitaba más configuración para tenerlo disponible en mi prueba, así que terminé usando el MemoryRouter que funcionó muy bien y sin ningún problema.

import React from ''react''; import renderer from ''react-test-renderer''; import { MemoryRouter } from ''react-router-dom''; // SampleComponent imports Link internally import SampleComponent from ''../SampleComponent''; describe(''SampleComponent'', () => { test(''should render'', () => { const component = renderer .create( <MemoryRouter> <SampleComponent /> </MemoryRouter> ) .toJSON(); expect(component).toMatchSnapshot(); }); });


mi prueba como esta

import * as React from ''react'' import DataBaseAccout from ''../database-account/database-account.component'' import { mount } from ''enzyme'' import { expect } from ''chai'' import { createStore } from ''redux'' import reducers from ''../../../reducer/reducer'' import { MemoryRouter } from ''react-router'' let store = createStore(reducers) describe(''mount database-account'', () => { let wrapper beforeEach(() => { wrapper = mount( < MemoryRouter > <DataBaseAccout store={store} /> </MemoryRouter > ) }) afterEach(() => { wrapper.unmount() wrapper = null }) })

pero no sé por qué MemoryRouter puede resolver esto