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で証拠を残します。
- UI: controlが操作され、結果が見える
- IPC: commandとargumentsが記録された
- Mock: 期待responseまたはerrorが返った
- Side effect: real file I/Oを使うtestだけfixtureが変化した
mocked file writeはdisk fileの存在を証明しません。persistenceが受入条件ならtemporary directoryと別のfilesystem assertionを使います。
troubleshooting checklist
- transport-level mock変更前にcurrent sessionを止める
- empty command tableから始め、flowが使うcommandを列挙する
- unknown commandを失敗させる
- testごとにmockをresetする
- harnessのevent対応を確認する
- 起動binaryまたはdev URLが最新か確認する
- mocked IPCとreal filesystemの証拠を分ける
参考
- Tauri: Mock APIs
- Tauri: WebDriver testing
- VitestでTauri Zustand storeをテストする
- Tauri v2 Updaterをlocal mock serverで検証する
まとめ
E2E IPC mockはcallbackだけでなくtest sessionに属します。transport-level mockを交換する前にsessionを止め、未処理commandを拒否し、eventを明示的に扱い、UI・IPC・実side effectを別々に検証します。