テスト

画面外で描画し、キーを押して、フレームをテキストとして検証します。

この章のアプリはコンソールで動作しています。⌘⌥JCtrl+Shift+J⌘⌥KCtrl+Shift+K⌘⌥Cで開き(先に開発者向け機能を有効化)、試してください。
章の動画を見る3:14

この章の内容

  • 最初のテスト
  • キー入力
  • テストの実行
  • スナップショット

@textjs/app/testing はアプリを画面外でレンダリングし、キーを押して、フレームをプレーンテキストで返します。テストはブラウザーやDevToolsなしで実行できます。

最初のテスト

app/deployments/page.test.tsx+19tsx
追加:import { afterEach, beforeEach, expect, mock, spyOn, test } from "bun:test";追加:import { cleanup, render } from "@textjs/app/testing";追加:import { DEPLOYMENTS } from "../../lib/deployments";追加:import DeploymentsPage from "./page";追加:追加:beforeEach(() => {追加:  spyOn(globalThis, "fetch").mockResolvedValue(Response.json(DEPLOYMENTS));追加:});追加:追加:afterEach(() => {追加:  mock.restore();追加:  return cleanup();追加:});追加:追加:test("lists every deployment", async () => {追加:  const app = await render(<DeploymentsPage />, { cols: 80, rows: 12 });追加:  await app.waitForText("feat: stream cells downward");追加:  expect(app.lines()).toHaveLength(12);追加:});

このページは /api/deployments からデータを取得しますが、bun test ではサーバーがないため、beforeEach で fetch をスタブ化し、同じデータを返します。render のデフォルトは80×24のグリッドです。lastFrame() はフレーム全体をテキストで返し、lines() は行ごとに返し、cell(x, y) は1つのセルの文字と色を返します。

キー入力

press は useKeymap と同じキー文字列を受け取ります。各呼び出しは act() 内で実行され、生成されたフレームをフラッシュするため、次のアサーションで更新が反映されます。

app/deployments/page.test.tsx+14tsx
追加:test("↓ moves the highlight", async () => {追加:  const app = await render(<DeploymentsPage />);追加:  await app.waitForText("feat: stream cells downward");追加:  await app.press("down");追加:  const row = app.lines().find((line) => line.includes("›"));追加:  expect(row).toContain("perf: merge spans across rows");追加:});追加:追加:test("4 sorts by build time", async () => {追加:  const app = await render(<DeploymentsPage />);追加:  await app.waitForText("Build");追加:  await app.press("4"); // sort by the 4th column追加:  expect(app.locate("12s")?.y).toBeLessThan(app.locate("52s")?.y ?? 0);追加:});

テーブルはハイライトされた行の先頭に › を描画するため、↓のテストではその行を見つけてコミットを確認します。数字キーは列を基準に並べ替え、4番目の列はBuildです。

テストの実行

bun test

Bun、Vitest、Jestなど、async テストに対応するランナーで実行できます。コンソールで Enter を押すとテストスイートを実行し、f を押すとテストを失敗させて、失敗時の表示を確認できます。

スナップショット

toAnsi() はフレームをトゥルーカラーANSIで返すため、色のリグレッションも検出するスナップショットを作成できます。

expect(app.toAnsi()).toMatchSnapshot();

試す

これは章の終わりに完成するAcme Deploysで、DevToolsで動作しています。パッドをクリックして、以下のキーを使います。

▼ 08 · テスト

コンソールを開く

⌘⌥J
CtrlShiftJ
⌘⌥K
CtrlShiftK
⌘⌥C

アプリはDevToolsに描画されます。まずSafariの「設定」→「詳細」で「Webデベロッパ用の機能を表示」をオンにします。 次にここをクリックして、Enterを押します。

デスクトップで開く

このアプリはDevToolsのコンソールに描画されるため、デスクトップブラウザーが必要です。

クイズ

2問

すべての問題に回答すると章を完了できます。

@textjs/app/testingの実行に必要なものは何ですか?

 

app.lastFrame()は何を返しますか?