Pengujian

Render aplikasi di luar layar, tekan tombol, dan uji frame dengan @textjs/app/testing.

@textjs/app/testing (atau @textjs/react/testing) me-render aplikasi Anda di luar layar, menekan tombol, dan mengembalikan frame sebagai teks. Pengujian berjalan tanpa browser atau 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");});

Modul ini bekerja dengan runner apa pun yang mendukung pengujian async, termasuk Bun, Vitest, dan Jest.

Rendering

MetodeDeskripsi
render(el, { cols, rows, theme })Memasang di luar layar (bawaan 80×24)
lastFrame()Frame sebagai teks biasa
lines()Frame sebagai array baris
framesSetiap frame berbeda hingga saat ini
toAnsi()ANSI truecolor, untuk snapshot
cell(x, y){ char, fg, bg, attrs }
locate(text){ x, y } dari kecocokan pertama
rerender(el) / unmount()Memperbarui atau melepas

renderToString(el, options) me-render satu kali dan mengembalikan teksnya.

Input

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

Setiap pemanggilan berjalan di dalam act() dan menuntaskan frame yang dihasilkan, sehingga asersi berikutnya melihat pembaruan tersebut.

Waktu

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

Animasi, spinner, dan toast menggunakan timer waktu nyata, sehingga wait dan waitFor menjadi cara yang dapat diandalkan untuk mengamatinya.

Snapshot

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

Spasi kosong di sisi kanan dan bagian bawah frame dipangkas, sehingga snapshot tidak terus berubah akibat spasi kosong.

Edit halaman ini di GitHub