最近、Flutterでアプリを作成する際にテストをしっかりと書くようにしています。
Riverpodを使用するときのユニットテストで若干躓いたので、備忘録としてまとめておきます。
Flutterによる自動テストを3記事に分けて公開するうちの1記事目です。
本記事ではユニットテストについてを記載します。
2記事目「【Flutter】Widgetテストのシンプルな書き方」はこちらからご覧ください。
3記事目「【Flutter】Integrationテストのシンプルな書き方」はこちらからご確認ください。
ユニットテストするControllerクラス
Riverpodでコードを書いていると、Controllerのようなロジッククラスをよく書くと思います。
ロジッククラスにはアプリの処理がゴリゴリに書いてあるので、しっかりとテストをしたいところです。
今回は以下のような超簡易Controllerクラスをテストする場合を想定します。
final calcProvider = StateNotifierProvider((ref) => CalcController(ref.read)); class CalcController extends StateNotifier<CalcState> { CalcController(this._read) : super(CalcState( text: "0", )); void input(String text){ if (state.text == "0") { state = state.copyWith(text: text); } else { state = state.copyWith(text: state.text + text); } } final Reader _read; }
電卓に表示する値(初期値0)を保持していて、電卓のボタンを押したら値が更新されるようなControllerです。
Controllerのテストクラスの書き方
早速テストクラスを書いていきます。
void main() { late CalcController target; setUp(() { final container = ProviderContainer(); target = container.read(calcProvider.notifier); }); test("riverpod test1", (){ expect(target.debugState.text, "0"); target.input("1"); target.input("5"); expect(target.debugState.text, "15"); }); test("riverpod test2", (){ expect(target.debugState.text, "0"); target.input("2"); target.input("3"); target.input("4"); expect(target.debugState.text, "234"); }); }
こんな感じになりました。
Containerをうまく使うことで、テスト用のデータを渡すことができたりするようです。
それ以外は特に目立ったところはなく、標準のflutter_testを使用して、testメソッドを作成し、expectでテストをしていきます。
まとめ
Riverpodを使用した場合のユニットテストコードの備忘録でした。
Riverpod関連のパッケージ内にも便利なテスト用のコードが含まれているので、そのあたりを駆使して良い感じにコードがかけそうです。
ひとまず超シンプルパターンはこの記事のように書けば良さそうなので、これを基礎として、もっと様々な処理を書いていきたいところです。
Flutter学習情報
Flutterを勉強するのに最適な参考書は、以下の「基礎から学ぶFlutter」です。
環境構築から、Dart/Flutterの基本/テストやパフォーマンスチューニングまで一通り学ぶことができます。
また、当ブログではFlutterを初心者が学ぶためにオススメな方法を「Flutter を初心者が学ぶおすすめの勉強法!【間違いない動画があります】」という記事で公開していますので、Flutterに興味がある方は是非読んでみてください。
動画学習がしたい!という方にオススメの記事がこちらです。
Flutterの将来性はどうなのか?をまとめた記事はこちらです。