Tests
Affichez des applications hors écran, simulez des touches et vérifiez les frames avec @textjs/app/testing.
@textjs/app/testing (ou @textjs/react/testing) effectue le rendu de votre application hors écran, simule des appuis sur les touches et renvoie la frame sous forme de texte. Les tests s’exécutent sans navigateur ni DevTools.
import { afterEach, expect, test } from "bun:test";import { cleanup, render } from "@textjs/app/testing";import { Counter } from "./counter";afterEach(cleanup);test("counts up", async () => { const app = await render(<Counter />, { cols: 40, rows: 6 }); await app.press("up up"); expect(app.lastFrame()).toContain("count = 2");});Cela fonctionne avec tout exécuteur prenant en charge les tests async, notamment Bun, Vitest et Jest.
Rendu
| Méthode | Description |
|---|---|
render(el, { cols, rows, theme }) | Montage hors écran (80×24 par défaut) |
lastFrame() | Frame en texte brut |
lines() | Frame sous forme de tableau de lignes |
frames | Ensemble des frames distinctes jusqu’ici |
toAnsi() | ANSI en couleurs vraies, pour les instantanés |
cell(x, y) | { char, fg, bg, attrs } |
locate(text) | { x, y } de la première correspondance |
rerender(el) / unmount() | Mise à jour ou démontage |
renderToString(el, options) effectue un seul rendu et renvoie le texte.
Entrées
await app.press("down");await app.press("ctrl+k"); // modifiersawait app.press("g g"); // a sequenceawait app.press("G"); // Shift+Gawait app.type("hello\n"); // one key per character, \n is Enterawait app.paste("multi\nline");await app.wheel(3);await app.resize(120, 36);Chaque appel s’exécute dans act() et traite les frames qui en résultent, pour que l’assertion suivante voie la mise à jour.
Temps
await app.wait(300); // real time passes, then frames flushawait app.waitForText("Deployed"); // poll until the frame contains itawait app.waitFor(() => expect(saved).toBe(true), { timeout: 2000 });Les animations, les indicateurs de chargement et les notifications utilisent des temporisateurs réels, donc wait et waitFor constituent le moyen fiable de les observer.
Instantanés
expect(app.lastFrame()).toMatchSnapshot();expect(app.toAnsi()).toMatchSnapshot(); // colors tooLes espaces en fin de ligne et les lignes vides en bas des frames sont supprimés, ce qui évite les changements d’instantanés dus aux espaces.