コンテンツにスキップ
Tauri

Mock Tauri APIs(モック・ランタイム)

import TranslationNote from ‘@components/i18n/TranslationNote.astro’;

フロントエンド・テストを作成する場合、ウィンドウをシミュレートしたり IPC 呼び出しをインターセプトしたりするための「仮の」Tauri 環境(いわゆる モッキング)を用意するのが一般的です。 @tauri-apps/api/mocks モジュールは、簡単にこの擬似環境を実現するための便利なツールをいくつか提供しています:

テストでの最も一般的な検証事項は、「IPC 要求」をインターセプトすることです。これはさまざまな状況で役立ちます。たとえば:

  • 正しいバックエンド呼び出しが行なわれていることを確認する
  • バックエンド関数からの異なる結果をシミュレーションする

Tauri では「IPC 要求」をインターセプトするための mockIPC 関数が利用できます。具体的な API の詳細については、こちら をご覧ください。

import { beforeAll, expect, test } from "vitest";
import { randomFillSync } from "crypto";
import { mockIPC } from "@tauri-apps/api/mocks";
import { invoke } from "@tauri-apps/api/core";
// 「jsdom テスト環境」には WebCrypto 実装が付属していません
beforeAll(() => {
Object.defineProperty(window, 'crypto', {
value: {
// @ts-ignore
getRandomValues: (buffer) => {
return randomFillSync(buffer);
},
},
});
});
test("invoke simple", async () => {
mockIPC((cmd, args) => {
// 二つの数字を加算するだけの「add」という Rust コマンドをシミュレートします
if(cmd === "add") {
return (args.a as number) + (args.b as number);
}
});
});

時には IPC 呼び出しに関するより多くの情報を追跡したい場合があります; たとえば、コマンドは何回呼び出されたか、そもそもコマンドは呼び出されたのかどうか、などです。 このようなテストには、他のスパイ・ツール(監視)およびモック・ツールと一緒に mockIPC() を使用できます。

import { beforeAll, expect, test, vi } from "vitest";
import { randomFillSync } from "crypto";
import { mockIPC } from "@tauri-apps/api/mocks";
import { invoke } from "@tauri-apps/api/core";
// 「jsdom テスト環境」には WebCrypto 実装が付属していません
beforeAll(() => {
Object.defineProperty(window, 'crypto', {
value: {
// @ts-ignore
getRandomValues: (buffer) => {
return randomFillSync(buffer);
},
},
});
});
test("invoke", async () => {
mockIPC((cmd, args) => {
// 二つの数字を加算するだけの「add」という Rust コマンドをシミュレートします
if(cmd === "add") {
return (args.a as number) + (args.b as number);
}
});
// vitest が提供するスパイ・ツールを使用して、モック化された関数を追跡することができます。
const spy = vi.spyOn(window.__TAURI_INTERNALS__, "invoke");
expect(invoke("add", { a: 12, b: 15 })).resolves.toBe(27);
expect(spy).toHaveBeenCalled();
});

モック化 mocked function「モック化された関数」。テスト環境などで呼び出されるモック関数で指定され、仮想的・擬似的に実行される(仮の)関数。

サイドカー」(埋め込まれた外部プログラム)やシェル・コマンドへの IPC 要求をモック化するには、spawn() または execute() が呼び出されたときのイベント・ハンドラーの ID を取得し、この ID を使用してバックエンドが返信するイベントを発行させます:

mockIPC(async (cmd, args) => {
if (args.message.cmd === 'execute') {
const eventCallbackId = `_${args.message.onEventFn}`;
const eventEmitter = window[eventCallbackId];
// 「標準出力 Stdout」イベントは何度でも呼び出し可能です
eventEmitter({
event: 'Stdout',
payload: 'some data sent from the process',
});
// 「プロミス」での処理を完了するには、最後に「Terminated」イベントを呼び出します
eventEmitter({
event: 'Terminated',
payload: {
code: 0,
signal: 'kill',
},
});
}
});

プロミス Promise: Promise は JavaScript で非同期処理が完了したときに結果(resolve または reject)を返すオブジェクトです。

Windows では、時として Windows 固有のコード(たとえば、スプラッシュ・スクリーン・ウィンドウ)のために、異なるウィンドウのシミュレーションが必要となる場合があります。 mockWindows() メソッドを使用すると、仮のウィンドウ・ラベルを作成できます。最初の文字列が「現在の」ウィンドウ(つまり、JavaScript 自身がそのウィンドウ内にあると認識しているウィンドウ)を識別し、その他の文字列は追加ウィンドウとして扱われます。

import { beforeAll, expect, test } from 'vitest';
import { randomFillSync } from 'crypto';
import { mockWindows } from '@tauri-apps/api/mocks';
// 「jsdom テスト環境」には WebCrypto 実装が付属していません
beforeAll(() => {
Object.defineProperty(window, 'crypto', {
value: {
// @ts-ignore
getRandomValues: (buffer) => {
return randomFillSync(buffer);
},
},
});
});
test('invoke', async () => {
mockWindows('main', 'second', 'third');
const { getCurrent, getAll } = await import('@tauri-apps/api/webviewWindow');
expect(getCurrent()).toHaveProperty('label', 'main');
expect(getAll().map((w) => w.label)).toEqual(['main', 'second', 'third']);
});
【※ この日本語版は、「Jan 22, 2025 英語版」に基づいています】

© 2025 Tauri Contributors. CC-BY / MIT