Unit тестирование является важной частью разработки компонентов в Atomico, поскольку позволяет изолированно проверять поведение отдельных элементов интерфейса, их реакцию на свойства, события и внутреннее состояние. Atomico предоставляет удобные инструменты для интеграции с популярными фреймворками тестирования, такими как Jest и Testing Library, обеспечивая высокую точность проверки.
Тестирование компонентов в Atomico строится на нескольких ключевых принципах:
Файлы тестов обычно располагаются рядом с компонентами, например:
src/components/button.js
src/components/button.test.js
Такой подход упрощает поддержку и обеспечивает ясную структуру проекта.
Пример простого компонента кнопки в Atomico:
import { c, useState } from "atomico";
function Button({ label }) {
const [clicked, setClicked] = useState(false);
return (
<button
oncl ick={() => setClicked(true)}
>
{clicked ? "Clicked!" : label}
</button>
);
}
Button.props = {
label: String
};
export const button = c(Button);
Компонент имеет состояние (clicked) и
свойство (label), что делает его отличным
объектом для unit тестирования.
Для интеграции с Jest и Testing Library необходимо:
npm install --save-dev jest @testing-library/dom @testing-library/jest-dom
// jest.config.js
module.exports = {
testEnvironment: "jsdom",
setupFilesAfterEnv: ["@testing-library/jest-dom/extend-expect"]
};
Проверка правильного отображения начального состояния:
import { html, render } from "atomico";
import { button } from "./button";
test("рендерит кнопку с переданным текстом", () => {
const root = document.createElement("div");
render(root, html`<${button} label="Click me" />`);
const btn = root.querySelector("button");
expect(btn).toBeInTheDocument();
expect(btn.textContent).toBe("Click me");
});
Ключевые моменты:
html из Atomico позволяет создавать
компоненты в тестах аналогично JSX.Проверка реакции на пользовательские действия:
test("клик изменяет текст кнопки", () => {
const root = document.createElement("div");
render(root, html`<${button} label="Click me" />`);
const btn = root.querySelector("button");
btn.click();
expect(btn.textContent).toBe("Clicked!");
});
Особенности:
useState автоматически обновляет DOM при изменении
состояния, что упрощает тестирование интерактивных компонентов.Компоненты Atomico используют статическое свойство props
для описания ожидаемых свойств. Unit тесты могут проверять корректную
работу с разными значениями пропсов:
test("изменение пропса label обновляет текст", () => {
const root = document.createElement("div");
const instance = render(root, html`<${button} label="First" />`);
instance.props = { label: "Second" };
const btn = root.querySelector("button");
expect(btn.textContent).toBe("Second");
});
Такой подход гарантирует, что компонент корректно реагирует на обновление входных данных.
Если компонент зависит от внешних функций или сервисов, их можно мокировать:
import { fetchData } from "./api";
jest.mock("./api");
test("обработка данных с API", async () => {
fetchData.mockResolvedValue({ name: "Test" });
const root = document.createElement("div");
render(root, html`<${myComponent} />`);
// ожидание асинхронного обновления
await new Promise(r => setTimeout(r, 0));
const element = root.querySelector(".name");
expect(element.textContent).toBe("Test");
});
Mocking позволяет проверять компонент в чистом виде, без зависимости от реального API.
Unit тестирование в Atomico интегрируется естественно благодаря тесной связке с DOM и реактивными хуками, что делает процесс тестирования компонентов быстрым и надежным.