Komponententests für Smolitux UI
Dieses Dokument beschreibt die implementierten Unit-Tests und Integrationstests für die Smolitux UI-Bibliothek.
Überblick
Die folgenden Komponenten wurden mit Unit-Tests abgedeckt:
- Button
- Card
- Checkbox
- Input
- Radio
- Select
- TabView
Zusätzlich wurden Integrationstests für folgende Szenarien implementiert:
- Formulare mit verschiedenen Formular-Elementen
- Theme-Integration
Unit-Tests
Button-Komponente
Die Button-Komponente wurde umfassend getestet, um sicherzustellen, dass sie korrekt funktioniert und alle Props korrekt verarbeitet.
test('renders correctly with default props', () => {
render(<Button>Click me</Button>);
expect(screen.getByRole('button', { name: /Click me/i })).toBeInTheDocument();
expect(screen.getByRole('button')).toHaveClass('bg-primary-600'); // Primär-Variante als Default
});
Card-Komponente
Die Card-Komponente wurde getestet, um sicherzustellen, dass sie korrekt gerendert wird und alle Props korrekt verarbeitet.
test('renders with different variants', () => {
const { rerender } = render(<Card variant="elevated">Elevated Card</Card>);
expect(screen.getByText('Elevated Card').parentElement).toHaveClass('shadow-md');
rerender(<Card variant="outlined">Outlined Card</Card>);
expect(screen.getByText('Outlined Card').parentElement).toHaveClass('border');
rerender(<Card variant="flat">Flat Card</Card>);
expect(screen.getByText('Flat Card').parentElement).toHaveClass('bg-white');
});
Checkbox-Komponente
Die Checkbox-Komponente wurde getestet, um sicherzustellen, dass sie korrekt gerendert wird und alle Props korrekt verarbeitet.
test('handles change events', async () => {
const handleChange = jest.fn();
render(<Checkbox onChange={handleChange} />);
const checkbox = screen.getByRole('checkbox');
await userEvent.click(checkbox);
expect(handleChange).toHaveBeenCalledTimes(1);
});
Input-Komponente
Die Input-Komponente wurde getestet, um sicherzustellen, dass sie korrekt gerendert wird und alle Props korrekt verarbeitet.
test('shows error message when provided', () => {
render(<Input error="Required field" />);
expect(screen.getByText('Required field')).toBeInTheDocument();
expect(screen.getByRole('textbox')).toHaveAttribute('aria-invalid', 'true');
});
Radio-Komponente
Die Radio-Komponente und RadioGroup wurden getestet, um sicherzustellen, dass sie korrekt gerendert werden und alle Props korrekt verarbeiten.
test('sets the correct radio as checked', () => {
render(
<RadioGroup name="options" value="option2">
<Radio value="option1" label="Option 1" />
<Radio value="option2" label="Option 2" />
<Radio value="option3" label="Option 3" />
</RadioGroup>
);
expect(screen.getByLabelText('Option 1')).not.toBeChecked();
expect(screen.getByLabelText('Option 2')).toBeChecked();
expect(screen.getByLabelText('Option 3')).not.toBeChecked();
});
Select-Komponente
Die Select-Komponente wurde getestet, um sicherzustellen, dass sie korrekt gerendert wird und alle Props korrekt verarbeitet.
test('renders all options correctly', () => {
render(<Select options={options} />);
const selectElement = screen.getByRole('combobox');
const optionElements = screen.getAllByRole('option');
expect(optionElements).toHaveLength(3);
expect(optionElements[0]).toHaveTextContent('Option 1');
expect(optionElements[1]).toHaveTextContent('Option 2');
expect(optionElements[2]).toHaveTextContent('Option 3');
});
TabView-Komponente
Die TabView-Komponente wurde getestet, um sicherzustellen, dass sie korrekt gerendert wird und alle Props korrekt verarbeitet.
test('changes active tab when clicked', async () => {
render(
<TabView>
<Tab label="Tab 1">
<TabPanel>Content 1</TabPanel>
</Tab>
<Tab label="Tab 2">
<TabPanel>Content 2</TabPanel>
</Tab>
<Tab label="Tab 3">
<TabPanel>Content 3</TabPanel>
</Tab>
</TabView>
);
// Initially, the first tab is active
expect(screen.getByText('Content 1')).toBeInTheDocument();
// Click on the second tab
await userEvent.click(screen.getByText('Tab 2'));
// Now the second tab should be active
expect(screen.queryByText('Content 1')).not.toBeInTheDocument();
expect(screen.getByText('Content 2')).toBeInTheDocument();
expect(screen.queryByText('Content 3')).not.toBeInTheDocument();
});
Integrationstests
Formular-Integration
Der Formular-Integrationstest stellt sicher, dass alle Formular-Elemente korrekt zusammenarbeiten.
test('handles form submission with all form elements', async () => {
const handleSubmit = jest.fn(e => e.preventDefault());
render(
<form data-testid="test-form" onSubmit={handleSubmit}>
<Input label="Name" name="name" placeholder="Enter your name" />
<Input label="Email" name="email" type="email" placeholder="Enter your email" />
<Select
label="Country"
name="country"
options={[
{ value: 'de', label: 'Germany' },
{ value: 'fr', label: 'France' },
{ value: 'uk', label: 'United Kingdom' }
]}
/>
<RadioGroup name="gender" label="Gender">
<Radio value="male" label="Male" />
<Radio value="female" label="Female" />
<Radio value="other" label="Other" />
</RadioGroup>
<Checkbox name="terms" label="I agree to the terms and conditions" />
<Button type="submit">Submit</Button>
</form>
);
// Fill out the form
await userEvent.type(screen.getByLabelText('Name'), 'John Doe');
await userEvent.type(screen.getByLabelText('Email'), 'john@example.com');
// Select a country
await userEvent.selectOptions(screen.getByLabelText('Country'), 'fr');
// Select a gender
await userEvent.click(screen.getByLabelText('Male'));
// Check the terms checkbox
await userEvent.click(screen.getByLabelText('I agree to the terms and conditions'));
// Submit the form
await userEvent.click(screen.getByRole('button', { name: 'Submit' }));
expect(handleSubmit).toHaveBeenCalledTimes(1);
});
Theme-Integration
Der Theme-Integrationstest stellt sicher, dass alle Komponenten korrekt auf Themeänderungen reagieren.
test('components render correctly with light theme', () => {
render(
<ThemeProvider initialTheme="light">
<Card>
<h2>Theme Test</h2>
<Input label="Test Input" />
<Button>Test Button</Button>
</Card>
</ThemeProvider>
);
// In light theme, the card should have a white background
expect(screen.getByText('Theme Test').closest('.bg-white')).toBeInTheDocument();
// The button should have primary color classes
expect(screen.getByRole('button')).toHaveClass('bg-primary-600');
});
Testabdeckung
Die implementierten Tests decken die folgenden Aspekte der Komponenten ab:
- Rendering: Korrekte Darstellung der Komponenten
- Props: Korrekte Verarbeitung aller Props
- Interaktionen: Korrekte Reaktion auf Benutzerinteraktionen
- Zustände: Korrekte Darstellung verschiedener Zustände
- Accessibility: Korrekte Implementierung von Accessibility-Attributen
- Integration: Korrekte Zusammenarbeit der Komponenten
Nächste Schritte
Die folgenden Schritte sind als Nächstes geplant:
- Implementierung von Unit-Tests für weitere Komponenten: Alert, Badge, Modal, etc.
- Implementierung von weiteren Integrationstests: Tests für komplexere UI-Patterns
- Implementierung von Snapshot-Tests: Für visuelle Regressionstests
- Erhöhung der Testabdeckung: Für komplexere Komponenten und Edge-Cases
Fazit
Die implementierten Unit-Tests und Integrationstests bieten eine solide Grundlage für die Qualitätssicherung der Smolitux UI-Bibliothek. Die Tests stellen sicher, dass die Komponenten korrekt funktionieren und alle Props korrekt verarbeiten. Die Integrationstests stellen sicher, dass die Komponenten korrekt zusammenarbeiten.