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.

counter.test.tsxtsx
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éthodeDescription
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
framesEnsemble 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 too

Les 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.

Modifier cette page sur GitHub