Я пытаюсь создать тестовый модуль для моего простого приложения React с использованием библиотеки тестирования React. Я перечитал все документы и застрял в нем.
API был создан приложением create React. Одной из особенностей является то, что пользователь может менять тему. Есть setTheme hook, который собирается менять тему «темный» и «светлый».
Приложение. js
const App = () => {
const [theme, setTheme] = useState('dark');
return ( <div>
<Header theme={theme} setTheme={setTheme} />
</div>)
};
Заголовок. js
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
const Header = props => {
return (
<header data-testid="header">
<h1><span className="highlight">Github Users</span></h1>
{props.theme === "dark" ?
<FontAwesomeIcon data-testid="button" icon="sun" size="2x" color="#dcba31" onClick={ () => props.setTheme('light') }/>
: <FontAwesomeIcon icon="moon" size="2x" color="#1c132d" onClick={ () => props.setTheme('dark') }/>}
</header>
);
}
export default Header;
В компоненте Header я добавил функцию стрелки, которая меняет цвет темы.
Теперь я пытаюсь написать тест, который будет проверять компонент заголовка. Ожидаемый результат заключается в том, что после первого рендера компонент Header должен отобразить значок "солнце". После того, как пользователь нажмет на него, в заголовке появится значок «Луна»
Есть кое-что, что я пытаюсь, но это не работает, как я упоминал.
Header.test. js
import React from 'react';
import { render, cleanup } from "@testing-library/react"
import '@testing-library/jest-dom/extend-expect';
import { act } from "react-dom/test-utils";
import Header from '../components/Header';
afterEach(cleanup);
describe("Header Component", () => {
it("first render should return a sun icon", () => {
const {getByTestId } = render(<Header />)
expect(getByTestId("header"). // What method uses here? To check if it is icon sun or moon ? )
})
it("after mouse click event should return a moon icon", () => {
const button = document.querySelector("svg"); // it is correct way to add a svg element as a button ?
act( () => {
button.dispatchEvent(new MouseEvent('click', {bubbles: true}));
})
expect(getByTestId("header"). // again what to write here to test it after click ?
})
})
Я уверен, что есть какой-то другой способ проверить сначала рендер, а затем после того, как щелкнуть какой компонент рендеринга заголовка. Я думаю, что проблема в том, что есть еще один компонент, который отображается условно. Если это текст, проблем нет, но после рендера появляется элемент svg с некоторыми атрибутами, такими как icon = "sun" / icon = "moon".
Live версия проекта
Github Repo Link
Вопросы :
- Как правильно проверить этот компонент заголовка?
- Как пройти тест в тесте, например. Я хочу использовать этот метод setTheme в тесте, как это сделать?