🥹

【備忘録】Flutterのsqfliteを使ったアプリのテストで詰まった時

2023/07/17に公開

対象読者

  • sqfliteを使ったアプリのテストをしようとして詰まった人
  • 未来の自分

環境


Dart SDK version: 3.0.3 (stable) (Wed May 31 15:35:05 2023 +0000) on "macos_arm64"
Flutter 3.10.4 • channel stable • https://github.com/flutter/flutter.git
Framework • revision 682aa387cf (6 weeks ago)2023-06-05 18:04:56 -0500
Engine • revision 2a3401c9bb
Tools • Dart 3.0.3 • DevTools 2.23.1

事象

  • DBのCRUD関連のテストをしたかった。
  • 修正前のコーはこんな感じ

test("DBからタスクの一覧を取得する", () async {
    final driver = TodoDriverImpl();
    // ここでDBへの接続開いたり、データの参照をしたりしている
    final actual = await driver.getAll();
    List<DriverTask> expected = [];
    
    expect(actual, expected);
});

  • 以下のエラーが出て詰まった
    • ” DBが初期化されていないよ ” って言われているがそんなことわかっとるわい
    • " databaseFactory = databaseFactoryFfi; " をDB接続をする処理の前に入れてもだめ
    • もうはぁ〜〜〜〜って感じで数時間悩みました。

Error: Bad state: databaseFactory not initialized
databaseFactory is only initialized when using sqflite. When using `sqflite_common_ffi`
You must call `databaseFactory = databaseFactoryFfi;` before using global openDatabase API

解決法

  • 以下の3行を入れないといけない。
    • エラーメッセージの1行の他に2つ初期化処理を入れないといけなかったという感じでした。

TestWidgetsFlutterBinding.ensureInitialized();
sqfliteFfiInit();
databaseFactory = databaseFactoryFfi;

まとめ

  • 解決するとこんなことだったのかと思って、忘れるのでアウトプットは大事
  • Flutterにまた一つ強くなった
  • 次は、StateとNotifier周りに強くなりたい

Discussion