mcpField
R
riverpod-testing

riverpod-testing

github.com/serverpodテスト・品質1098 回インストール34 週間前に更新
リポジトリ

riverpod-testing について

Flutter の有無に応じた Dart の provider テスト手法を説明する Riverpod のスキルです。単体テストやウィジェットテストを行う開発者向けに、コンテナ、オーバーライド、非同期処理、監視、Notifier のモックを扱います。

主な機能

  1. 01テストごとに ProviderContainer.test() を作成
  2. 02ProviderScope 内でウィジェットをテスト
  3. 03overrides による provider の置き換え
  4. 04非同期 provider の値の待機
  5. 05provider の監視と Notifier のモック

活用シーン

  1. 01Flutter を使わない Riverpod 単体テスト
  2. 02provider に依存するウィジェットのテスト
  3. 03非同期 provider の結果検証
  4. 04テストでの provider 依存関係の置き換え

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/serverpod/skills-registry --skill riverpod-testing

インストール後、Claude Code で/riverpod-testingを入力して読み込まれたか確認します。

詳細

Riverpod — テスト

手順

Riverpod はテストしやすいように設計されています。テストごとに状態を分離し、オーバーライドでモックし、本番環境に近いテスト環境を維持します。

ユニットテスト(Flutter なし)

テスト用のコンテナを作成するには、ProviderContainer.test() を使用します。テスト間でコンテナを共有しないでください。

void main() {
  test('Some description', () {
    final container = ProviderContainer.test();
    expect(container.read(provider), equals('some value'));
  });
}
  • container.read(provider) — 現在の値を読み取ります。
  • container.listen(provider, (prev, next) {}) — リッスンしてサブスクリプションを取得します。読み取りには subscription.read() を使用します。プロバイダーが自動破棄される場合は、テスト中に破棄されないよう、listen を優先してください。
final subscription = container.listen<String>(provider, (_, _) {});
expect(subscription.read(), 'Some value');
ウィジェットテスト

テスト対象のウィジェットを ProviderScope でラップします。

testWidgets('Some description', (tester) async {
  await tester.pumpWidget(
    const ProviderScope(child: YourWidgetYouWantToTest()),
  );
});

テストでプロバイダーを操作するには、tester.container() でコンテナを取得します。

final container = tester.container();
expect(container.read(provider), 'some value');
プロバイダーのモック

ProviderContainer または ProviderScope で overrides を使用します。追加の設定なしで、すべてのプロバイダーをオーバーライドできます。

final container = ProviderContainer.test(
  overrides: [
    exampleProvider.overrideWith((ref) => 'Hello from tests'),
  ],
);

// Or in widget tests:
await tester.pumpWidget(
  ProviderScope(
    overrides: [exampleProvider.overrideWith((ref) => 'Hello from tests')],
    child: const YourWidgetYouWantToTest(),
  ),
);

family のオーバーライドやその他のオーバーライド方法については、riverpod-overrides を参照してください。

非同期プロバイダーの待機

provider.future を読み取ると、プロバイダーの値で完了する Future を取得できます。expectLater と組み合わせて使用します。

await expectLater(
  container.read(provider.future),
  completion('some value'),
);
リッスン/スパイ

container.listen(provider, callback) を使用し、コールバックの引数を検証するか、値をリストに収集して検証します。mockito/mocktail の verify パターンでも使用できます。

Notifier のモック

Notifier 自体をモックするのではなく、Notifier が使用する依存関係(リポジトリなど)をモックすることを優先してください。Notifier をモックする必要がある場合は、実装ではなくサブクラス化し、元の基底クラスを拡張するモックにしてください。コード生成を使用する場合、生成された基底クラスにアクセスできるよう、通常は Notifier と同じファイルにモックを配置する必要があります。

その他の例については、riverpod-overrides と公式ドキュメントを参照してください。

コメント