Kiểm thử

Render ứng dụng ngoài màn hình, nhấn phím và kiểm tra frame bằng @textjs/app/testing.

@textjs/app/testing (hoặc @textjs/react/testing) render ứng dụng ngoài màn hình, nhấn phím và trả về frame dưới dạng văn bản. Kiểm thử chạy không cần trình duyệt hay 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");});

Công cụ này hoạt động với mọi trình chạy hỗ trợ kiểm thử async, bao gồm Bun, Vitest và Jest.

Render

Phương thứcMô tả
render(el, { cols, rows, theme })Gắn ngoài màn hình (mặc định 80×24)
lastFrame()Frame dưới dạng văn bản thuần
lines()Frame dưới dạng mảng các dòng
framesMọi frame khác biệt tính đến hiện tại
toAnsi()ANSI truecolor, dùng cho snapshot
cell(x, y){ char, fg, bg, attrs }
locate(text){ x, y } của kết quả khớp đầu tiên
rerender(el) / unmount()Cập nhật hoặc tháo gỡ

renderToString(el, options) render một lần và trả về văn bản.

Đầu vào

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

Mỗi lời gọi chạy bên trong act() và xử lý hết các frame sinh ra, nên phép kiểm tra tiếp theo thấy trạng thái cập nhật.

Thời gian

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

Hoạt ảnh, biểu tượng xoay và thông báo toast dùng bộ hẹn giờ thực, nên wait và waitFor là cách đáng tin cậy để quan sát chúng.

Snapshot

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

Khoảng trắng ở bên phải và phía dưới frame bị cắt bỏ, nên snapshot không thay đổi liên tục vì khoảng trắng.

Sửa trang này trên GitHub