Atomico — библиотека для создания веб-компонентов на базе JavaScript, ориентированная на реактивность и модульность. Одним из ключевых элементов разработки является правильная проверка и тестирование пропсов, так как именно через них компоненты получают данные и взаимодействуют с окружающей средой.
Пропсы в Atomico задаются с помощью функции props,
которая позволяет указать тип, значение по
умолчанию и валидацию. Стандартный
синтаксис:
import { c, props, useState } from "atomico";
const MyComponent = c(
() => {
const [count, setCount] = useState(0);
return <div>{count}</div>;
},
{
count: props.number
}
);
Ключевые моменты:
props.number, props.string,
props.boolean — базовые типы.props.arrayOf(type) и
props.shape({ ... }) для сложных структур.default.Пример с дефолтным значением:
const MyComponent = c(
() => {},
{
count: props.number({ default: 0 })
}
);
Atomico не включает встроенного механизма runtime проверки типов
пропсов в production. Для тестирования используются
юнит-тесты с библиотеками типа Jest и
Testing Library. Основные подходы:
import { render } from "@testing-library/atomico";
import MyComponent from "./MyComponent";
test("должен корректно принимать числовой проп count", () => {
const { root } = render(<my-component count={5} />);
expect(root.count).toBe(5);
});
test("значение по умолчанию должно быть 0", () => {
const { root } = render(<my-component />);
expect(root.count).toBe(0);
});
const MyComponent = c(
() => {},
{
user: props.shape({
name: props.string({ default: "Аноним" }),
age: props.number
})
}
);
test("корректная структура user", () => {
const { root } = render(<my-component user={{ age: 30 }} />);
expect(root.user.name).toBe("Аноним");
expect(root.user.age).toBe(30);
});
Для комплексного тестирования удобно мокировать пропсы, чтобы проверить реакцию компонента на различные значения:
const mockUser = { name: "Иван", age: 25 };
const { root } = render(<my-component user={mockUser} />);
expect(root.user.name).toBe("Иван");
Мокирование позволяет изолировать компонент от внешнего состояния и фокусироваться на его реактивной логике.
Atomico автоматически обновляет компонент при изменении пропсов. В тестах это проверяется через рендер с обновлением атрибутов:
const { root, update } = render(<my-component count={1} />);
expect(root.count).toBe(1);
update({ count: 10 });
expect(root.count).toBe(10);
Важно убедиться, что компонент правильно реагирует на новые значения и внутреннее состояние корректно синхронизируется.
Atomico поддерживает кастомные функции проверки пропсов через
свойство validate:
const MyComponent = c(
() => {},
{
score: props.number({
validate: (value) => value >= 0 && value <= 100
})
}
);
test("валидное значение score", () => {
const { root } = render(<my-component score={85} />);
expect(root.score).toBe(85);
});
Функция валидации позволяет ловить некорректные данные на этапе разработки, но не предотвращает ошибку в runtime production.
Для интеграционного тестирования пропсов удобно использовать
@testing-library/atomico:
render возвращает объект с доступом к
корню компонента, его пропсам и методам.update позволяет менять пропсы после первоначального
рендера.querySelector для проверки
отображаемых данных, связанных с пропсами.Пример комплексного теста:
const { root, update, shadowRoot } = render(<my-component count={5} />);
expect(shadowRoot.textContent).toContain("5");
update({ count: 15 });
expect(shadowRoot.textContent).toContain("15");
Тестирование пропсов в Atomico — это сочетание проверки типов, значений по умолчанию и реактивного поведения. Этот подход обеспечивает устойчивость компонентов и предсказуемость их поведения при любых входных данных.