Я тестирую компонент, который содержит компонент Link .
Также требуется контекст, предоставленный Service.js
.
Вот код:
import React from "react"
import { Link } from "react-router-dom"
import { Context } from "./Service"
const List: React.FC = () => (
<Context.Consumer>
{items => (
<div>
{items
.map(({ name, id }) => (
<Link
to={`/items/${id}`}
key={id}
>
<p>{name}</p>
</Link>
))}
</div>
)}
</Context.Consumer>
)
export default List
Когда я запускаю следующий тест, я получаю сообщение об ошибке:
Invariant failed: You should not use <Link> outside a <Router>
Тест:
import React from "react"
import renderer from "react-test-renderer"
import { MemoryRouter } from "react-router"
describe("<List>", () => {
beforeEach(() => jest.resetModules())
it("renders with zero items", () => {
jest.doMock("./Service", () => ({
Context: {
Consumer: (props: any) => props.children([]),
},
}))
const List = require("./List").default
const tree = renderer
.create(<MemoryRouter><List /></MemoryRouter>)
.toJSON()
expect(tree).toMatchSnapshot()
})
it("renders with items", () => {
jest.doMock("./Service", () => ({
Context: {
Consumer: (props: any) =>
props.children([{ name: "d", id: "d" }]),
},
}))
const List = require("./List").default
const tree = renderer
// this line throws the error!
.create(<MemoryRouter><List /></MemoryRouter>)
.toJSON()
expect(tree).toMatchSnapshot()
})
})
ПРИМЕЧАНИЕ: если я удаляю beforeEach(() => jest.resetModules())
, тест работает, но игнорирует второй макет , работающий с пустым массивом.