riverpod-testing について
Flutter の有無に応じた Dart の provider テスト手法を説明する Riverpod のスキルです。単体テストやウィジェットテストを行う開発者向けに、コンテナ、オーバーライド、非同期処理、監視、Notifier のモックを扱います。
主な機能
- 01テストごとに ProviderContainer.test() を作成
- 02ProviderScope 内でウィジェットをテスト
- 03overrides による provider の置き換え
- 04非同期 provider の値の待機
- 05provider の監視と Notifier のモック
活用シーン
- 01Flutter を使わない Riverpod 単体テスト
- 02provider に依存するウィジェットのテスト
- 03非同期 provider の結果検証
- 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 と公式ドキュメントを参照してください。