Pruebas

Renderiza apps fuera de pantalla, pulsa teclas y verifica fotogramas con @textjs/app/testing.

@textjs/app/testing (o @textjs/react/testing) renderiza tu app fuera de pantalla, pulsa teclas y devuelve el fotograma como texto. Las pruebas se ejecutan sin navegador 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");});

Funciona con cualquier ejecutor que admita pruebas async, incluidos Bun, Vitest y Jest.

Renderizado

MétodoDescripción
render(el, { cols, rows, theme })Montaje fuera de pantalla (80×24 por defecto)
lastFrame()El fotograma como texto plano
lines()El fotograma como un array de filas
framesTodos los fotogramas distintos hasta el momento
toAnsi()ANSI de color verdadero, para instantáneas
cell(x, y){ char, fg, bg, attrs }
locate(text){ x, y } de la primera coincidencia
rerender(el) / unmount()Actualización o desmontaje

renderToString(el, options) renderiza una vez y devuelve el texto.

Entrada

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);

Cada llamada se ejecuta dentro de act() y procesa los fotogramas resultantes, de modo que la siguiente aserción ve la actualización.

Tiempo

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 });

Las animaciones, los indicadores de carga y las notificaciones emergentes usan temporizadores reales, por lo que wait y waitFor son la forma fiable de observarlos.

Instantáneas

expect(app.lastFrame()).toMatchSnapshot();expect(app.toAnsi()).toMatchSnapshot(); // colors too

Los fotogramas se recortan por la derecha y por abajo, de modo que las instantáneas no cambian por los espacios en blanco.

Editar esta página en GitHub