#javascript #reactjs #jestjs
Вопрос:
Я использую react, поэтому перед каждым тестом мне нужно создавать элемент контейнера. В настоящее время у меня есть что-то вроде этого:
import { screen } from '@testing-library/react';
import { render, unmountComponentAtNode } from 'react-dom';
import Form from './Form';
let container: Element | null = null;
// setup a DOM element as a render target
beforeEach(() => {
container = document.createElement('div');
document.body.appendChild(container);
});
// cleanup on exiting
afterEach(() => {
unmountComponentAtNode(container!);
container?.remove();
container = null;
})
test('renders with a heading', () => {
render(
<Form heading={'Form Heading'} />, container
);
const element = screen.getByText(/form heading/i);
expect(element).toBeInTheDocument();
});
Как вы, вероятно, ожидали, мне нужно выполнить beforeEach
настройку и afterEach
настройку для каждого тестового файла. Можно ли сделать это глобальным(после того, как мы стали глобальными, нам все еще нужен доступ к container
переменной to)? С нетерпением ждем вашего ответа!
Комментарии:
1. jestjs.io/docs/configuration#globalsetup-string или jestjs.io/docs/configuration#setupfilesafterenv-array
2. @Elias это правильно, но тогда у меня не будет доступа к
container
переменной3. Ну, это вообще плохая идея, я бы рекомендовал вам прочитать это: kentcdodds.com/blog/avoid-nesting-when-youre-testing , но опять же, очень плохо распределять переменную между тестами.
4. @Элиас, я не хочу делиться переменной… Я хочу, чтобы он был переопределен для каждого теста.
5. Куча практики. Тестирование пользовательского интерфейса действительно сложно. Я и сам до сих пор довольно много борюсь.
Ответ №1:
Хотя технически это не ответ на заданный вами вопрос, это решение вашей основной проблемы.
Вы импортируете неправильный render
:
import { render, unmountComponentAtNode } from 'react-dom';
render
Функция, импортированная из react-dom
, используется для фактического отображения результата в браузере, а не для тестирования.
Вам необходимо: import {render} from '@testing-library/react'
. Библиотека тестирования выполняет все функции по управлению контейнерами за вас.
Если вам действительно нужен контейнер для чего-либо, вы все равно можете это сделать:
const {container} = render(/* ... */);
Но в большинстве случаев в этом нет необходимости.