mocktail について
Dart と Flutter のテストでmocktailを使う開発者向けガイドです。コード生成なしのテストダブル作成、フォールバック値、スタブ設定、引数照合、呼び出し検証を説明します。
主な機能
- 01実オブジェクト、Fake、Mockの選択
- 02コード生成なしでMockを作成
- 03カスタムフォールバック値の登録
- 04メソッドと非同期呼び出しのスタブ設定
- 05呼び出しの検証と引数の取得
活用シーン
- 01Dartサービスのテストダブル作成
- 02テストで名前付き引数を照合
- 03呼び出し確認と引数の取得
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ evanca/ flutter-ai-rules --skill mocktailインストール後、Claude Code で/mocktailを入力して読み込まれたか確認します。
詳細
Mocktail スキル
このスキルでは、Dart および Flutter のテストでモックを作成する際に、mocktail パッケージを正しく使用する方法を定義します。
1. モック、フェイク、実オブジェクトの使い分け
| 用途 | 使用する場面 |
|---|---|
| 実オブジェクト | 実用上可能であれば、モックよりも優先してください。 |
フェイク(extends Fake) | 軽量なカスタム実装です。必要なメソッドだけをオーバーライドします。操作の検証が不要な場合は、モックよりも優先してください。 |
モック(extends Mock) | 操作を検証する(呼び出し回数や引数を確認する)必要がある場合、または動的な応答をスタブする場合にのみ使用してください。 |
Mockを継承するクラスに、@overrideメソッドや実装を追加しないでください。- モックは、テストに
verifyアサーションがある場合にのみ使用してください。それ以外の場合は、実オブジェクトまたはフェイクを優先してください。
2. モックの作成
class MockMyService extends Mock implements MyService {}
class FakeMyEvent extends Fake implements MyEvent {}
コード生成は不要です。Mockito とは異なり、Mocktail は実行時に noSuchMethod を使用します。
3. フォールバック値の登録
カスタム型を引数マッチャーとともに使用する前に、フォールバック値を登録してください。setUpAll 内、またはテストの冒頭で登録します。
setUpAll(() {
registerFallbackValue(FakeMyEvent());
});
any()、captureAny()、captureThat()とともに使用する null 非許容のカスタム型には、登録が必要です。- 引数マッチャーとともに使用するカスタム型は、すべてフォールバック値を登録してください。
4. スタブ
final mock = MockMyService();
// Return a value
when(() => mock.fetchData()).thenReturn('result');
// Throw an error
when(() => mock.fetchData()).thenThrow(Exception('error'));
// Dynamic/async response
when(() => mock.fetchData()).thenAnswer((_) async => 'result');
// Future<void>
when(() => mock.doWork()).thenAnswer((_) async {});
- 非同期メソッド(
FutureまたはFuture<void>を返すメソッド)は、必ずthenAnswerでスタブしてください。 - テストの主な対象でなくても、呼び出されることを想定しているメソッドはすべてスタブしてください。
5. 名前付きパラメーター
when と verify の呼び出しでは、必ずすべての名前付きパラメーターを含めてください。値を確認する必要がないパラメーターには、any(named: 'paramName') を使用します。
when(() => mock.fetch(
id: any(named: 'id'),
headers: any(named: 'headers'),
)).thenReturn(response);
- メソッドの名前付きパラメーターにデフォルト値が設定されていても、Mocktail ではすべてのパラメーターにマッチさせる必要があります。
6. 検証
verify(() => mock.fetchData()); // called at least once
verifyNever(() => mock.fetchData()); // never called
verify(() => mock.fetchData()).called(2); // called exactly twice
7. 引数マッチャー
// Any positional argument
when(() => mock.process(any())).thenReturn(true);
// Capture arguments for later assertions
final captured = verify(() => mock.process(captureAny())).captured;
print(captured.last);
- 正確な値を確認する必要がない位置引数には、
any()を使用してください。 - 条件付きで引数をキャプチャするには、
captureThat()を使用してください。 - 文字列の出力を照合する際は、その型の
.toString()が何を返すかを確認してください。
参考資料
コメント
Markdown 対応