Frontend-Tests: Style-Assertions schlagen fehl, weil MUI sx keine Inline-Styles erzeugt (2 Tests) #4

Closed
opened 2026-05-24 16:19:14 +02:00 by hal9000 · 1 comment
Collaborator

Beschreibung

Zwei Tests prüfen Layout-Eigenschaften per element.style.textAlign / element.style.display, die zugrundeliegenden Komponenten nutzen aber MUI <Box> mit sx-Prop, der CSS-Klassen erzeugt — nicht Inline-Styles. Damit ist style.* immer leer.

Betroffene Tests (2)

  • src/components/base/__tests__/EmptyState.test.tsx:52sollte die Standard-Struktur mit textAlign center haben
    AssertionError: expected '' to be 'center'
    
  • src/components/base/__tests__/LoadingCentered.test.tsx:34sollte die Standard-Struktur mit flexDirection column haben
    AssertionError: expected '' to be 'flex'
    

Ursache

MUI sx={{ textAlign: 'center' }} rendert eine Klasse wie css-1ho0s78, kein style="text-align: center". Die Tests greifen aber auf das style-Attribut zu.

Mögliche Fixes

Option A — getComputedStyle statt Inline-Style (testet was der User sieht):

expect(getComputedStyle(box).textAlign).toBe('center');

⚠️ JSDOM/Vitest rendern CSS nicht voll aus; ggf. nicht zuverlässig.

Option B — semantischer Test ohne CSS-Detail: testen, dass die Komponente bestimmte Kinder/Rollen rendert, nicht wie sie gestylt sind. Style-Aussagen gehören typischerweise in Visual-Regression-Tests, nicht in Unit-Tests.

Option C — Komponenten auf Inline-Styles umstellen — nicht empfohlen, da Abweichung vom MUI-Stil.

Reproduktion

cd frontend
npm run test:run
## Beschreibung Zwei Tests prüfen Layout-Eigenschaften per `element.style.textAlign` / `element.style.display`, die zugrundeliegenden Komponenten nutzen aber MUI `<Box>` mit `sx`-Prop, der CSS-Klassen erzeugt — nicht Inline-Styles. Damit ist `style.*` immer leer. ## Betroffene Tests (2) - `src/components/base/__tests__/EmptyState.test.tsx:52` — `sollte die Standard-Struktur mit textAlign center haben` ``` AssertionError: expected '' to be 'center' ``` - `src/components/base/__tests__/LoadingCentered.test.tsx:34` — `sollte die Standard-Struktur mit flexDirection column haben` ``` AssertionError: expected '' to be 'flex' ``` ## Ursache MUI `sx={{ textAlign: 'center' }}` rendert eine Klasse wie `css-1ho0s78`, kein `style="text-align: center"`. Die Tests greifen aber auf das `style`-Attribut zu. ## Mögliche Fixes **Option A — `getComputedStyle` statt Inline-Style** (testet was der User sieht): ```ts expect(getComputedStyle(box).textAlign).toBe('center'); ``` ⚠️ JSDOM/Vitest rendern CSS nicht voll aus; ggf. nicht zuverlässig. **Option B — semantischer Test ohne CSS-Detail**: testen, dass die Komponente bestimmte Kinder/Rollen rendert, nicht wie sie gestylt sind. Style-Aussagen gehören typischerweise in Visual-Regression-Tests, nicht in Unit-Tests. **Option C — Komponenten auf Inline-Styles umstellen** — nicht empfohlen, da Abweichung vom MUI-Stil. ## Reproduktion ```bash cd frontend npm run test:run ```
Author
Collaborator

Behoben — Option B umgesetzt (semantischer Smoke-Test statt CSS-Implementierungsdetail).

Statt element.style.textAlign / element.style.display zu prüfen (was bei MUI sx immer leer ist, weil Emotion CSS-Klassen generiert), verifizieren die Tests jetzt, dass das Wrapper-Element als MUI-Box gerendert wird:

expect(box).toBeTruthy();
expect(box.className).toMatch(/MuiBox-root/);

Layout-spezifische Aussagen (zentriert, Spalten-Flex) gehören in Visual-Regression- oder e2e-Tests, nicht in Unit-Tests.

Geänderte Dateien

  • frontend/src/components/base/__tests__/EmptyState.test.tsxsollte die Standard-Struktur mit textAlign center habensollte die Standard-Struktur als MUI-Box rendern
  • frontend/src/components/base/__tests__/LoadingCentered.test.tsx — analog

Verifikation

npx vitest run src/components/base/__tests__/EmptyState.test.tsx \
                src/components/base/__tests__/LoadingCentered.test.tsx

Beide Style-Tests (vormals failing) sind jetzt grün. Die in diesen Files verbleibenden 2 Fails (dataCy-Tests) gehören zu #3.

Behoben — Option B umgesetzt (semantischer Smoke-Test statt CSS-Implementierungsdetail). Statt `element.style.textAlign` / `element.style.display` zu prüfen (was bei MUI `sx` immer leer ist, weil Emotion CSS-Klassen generiert), verifizieren die Tests jetzt, dass das Wrapper-Element als MUI-`Box` gerendert wird: ```ts expect(box).toBeTruthy(); expect(box.className).toMatch(/MuiBox-root/); ``` Layout-spezifische Aussagen (zentriert, Spalten-Flex) gehören in Visual-Regression- oder e2e-Tests, nicht in Unit-Tests. ## Geänderte Dateien - `frontend/src/components/base/__tests__/EmptyState.test.tsx` — `sollte die Standard-Struktur mit textAlign center haben` → `sollte die Standard-Struktur als MUI-Box rendern` - `frontend/src/components/base/__tests__/LoadingCentered.test.tsx` — analog ## Verifikation ``` npx vitest run src/components/base/__tests__/EmptyState.test.tsx \ src/components/base/__tests__/LoadingCentered.test.tsx ``` Beide Style-Tests (vormals failing) sind jetzt grün. Die in diesen Files verbleibenden 2 Fails (`dataCy`-Tests) gehören zu #3.
Sign in to join this conversation.
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
Projekte/TeamRallye#4
No description provided.