明示的なコンテナ管理でテストを安定化。
多くの検証は ProviderContainer API で完結します。read/invalidate/refresh/listen と instance単位 override を中心に組み立てます。
テスト方針
純粋なコンテナテストと Widget統合テストを分けると見通しが良くなります。
Pure Dart
ProviderContainer を直接使い read/invalidate/refresh を検証
override
Providerインスタンス単位で overrideWith / overrideWithValue
Widgetテスト
外部注入コンテナを使う場合は明示 dispose
補足
ProviderContainer.listen は fireImmediately: true を付けない限り初期値を流しません。
実行コマンドとチェック項目
autoDispose を含むケースでは pending timer が残らないことまで確認します。
コマンド
flutter test
チェック項目
- 外部注入した ProviderContainer は tearDown で必ず dispose する。
- listen で初期値検証が必要なら fireImmediately: true を使う。
- autoDispose 検証では fake_async で autoDisposeDelay を経過させる。
例: 引数ごとの override
family 相当の Provider はファクトリ関数が返すインスタンス単位で override します。
product_provider_test.dart
class ProductById extends Provider<Product> {
ProductById(this.id) : super.args((id,));
final String id;
@override
Product build(ref) {
final repo = ref.watch(productRepoProvider);
return repo.fetch(id);
}
}
final container = ProviderContainer(
overrides: [
productByIdProvider('a').overrideWithValue(const Product(id: 'a', name: 'stub')),
],
);
// 検証後に解放
container.dispose();
このパターンは README と upstream テスト実装の方針に一致します。
Widgetテストではアンマウント後に外部コンテナを dispose してください。
autoDispose と keepAlive の境界条件は fake_async で再現可能です。