Jest `resetModules ()` нарушает контекст реагирующего маршрутизатора - PullRequest
0 голосов
/ 19 июня 2019

Я тестирую компонент, который содержит компонент 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()), тест работает, но игнорирует второй макет , работающий с пустым массивом.

1 Ответ

1 голос
/ 19 июня 2019

Исправлено путем принудительного повторного импорта маршрутизатора для каждого теста :

    // ...
    const { MemoryRouter } = require("react-router")`
    const List = require("./List").default
    const tree = renderer
    // ...

Хотя выглядит многословно.Пожалуйста, добавьте лучшее решение, если у вас есть, спасибо!

...