← ./articles-ja

Tauri E2EのIPC mockが途中で壊れる時はsessionからresetする

E2E testでアプリを開き、IPC mockを設定すると最初は通る。しかしmock設定を入れ替えた後、ECONNREFUSED、unknown command、event listenerの未解決が起きることがあります。

すぐにapplication codeを変えず、test session、mock transport、command table、確認したい実side effectの4層へ分けます。

mockを再設定する前に失敗layerを分類する

errorは原因layerの手掛かりになります。

  • connection refused: sessionが停止・交換済みtransportを参照している
  • unknown command: frontendがmock tableにないcommandを呼んだ
  • listenerが終わらない: request-response mockではevent pathを再現できない
  • UIが古い: harnessが古いbinaryまたはdev URLを起動した

再試行する前に、正確なcommand名とerrorを保存します。mock再設定を繰り返すと最初の原因が隠れます。

mock transportを交換する前にsession ownershipをresetする

E2E harnessがproxyやIPC bridgeを動かす場合、それもsessionの一部です。次の順序にします。

stop application session
dispose mock/proxy
wait for transport cleanup
install the new command table
start a fresh application session
run assertions
stop the session in finally/afterEach

API名はharnessごとに異なります。WebdriverIO Tauri serviceには専用mockがあり、custom MCP/WebDriver bridgeには明示的なstart/stopがある場合があります。ただし、交換したproxyへlive appを接続したままにしない原則は同じです。

user flowが通る全commandをmockする

file openはdialogだけで終わらないことがあります。

const responses: Record<string, unknown> = {
  "plugin:dialog|open": "C:/test-data/example.txt",
  "plugin:fs|read_file": new TextEncoder().encode("example"),
  load_preferences: { wrap: true },
};

function mockInvoke(command: string) {
  if (!(command in responses)) {
    throw new Error(`Unhandled test command: ${command}`);
  }
  return responses[command];
}

unknown commandは明示的に失敗させます。undefinedを返すと、mock漏れがapplication stateの失敗に見えます。

Tauri公式のmockIPC()はfrontend testに使え、WebdriverIO Tauri serviceではbrowser.tauri.mock()がE2E向け相当機能です。test間ではmockをclearします。

eventをinvoke responseと分ける

invoke()は1 requestと1 resultです。eventは後から複数回来ます。proxyがnative event listenerを扱えない場合は、明示的なevent emit hookを用意するか、event対応harnessでtestします。

最初のcommandから1値を返しただけで、event lifecycle全体を検証したことにはしません。payload順、回数、完了、unsubscribeも必要に応じてassertします。

UI・IPC・disk evidenceを別々に確認する

各boundaryで証拠を残します。

  1. UI: controlが操作され、結果が見える
  2. IPC: commandとargumentsが記録された
  3. Mock: 期待responseまたはerrorが返った
  4. Side effect: real file I/Oを使うtestだけfixtureが変化した

mocked file writeはdisk fileの存在を証明しません。persistenceが受入条件ならtemporary directoryと別のfilesystem assertionを使います。

troubleshooting checklist

  1. transport-level mock変更前にcurrent sessionを止める
  2. empty command tableから始め、flowが使うcommandを列挙する
  3. unknown commandを失敗させる
  4. testごとにmockをresetする
  5. harnessのevent対応を確認する
  6. 起動binaryまたはdev URLが最新か確認する
  7. mocked IPCとreal filesystemの証拠を分ける

参考

まとめ

E2E IPC mockはcallbackだけでなくtest sessionに属します。transport-level mockを交換する前にsessionを止め、未処理commandを拒否し、eventを明示的に扱い、UI・IPC・実side effectを別々に検証します。