0
0

More than 1 year has passed since last update.

FlutterでDriftを使用してみた~テスト編~

Last updated at Posted at 2023-05-24

はじめに

FlutterにDriftを導入したときの手順を残しておきます。
今回はテストを書いたときについてです。

本記事は以下の公式ドキュメントを参考にしています。
詳しいことが知りたい方はこちらを参照してください。

環境

Dart-2.19.6Flutter-3.7.12Drift-2.7.0

テスト用の設定

テストでメモリ上にデータベースを展開できるようにするために、コンストラクタで設定を受け取れるように修正しておきます。

database.dart
@DriftDatabase(tables: [Todos, Categories])
class MyDatabase extends _$MyDatabase {
  // コンストラクタでDBの保存先を定義する
-  MyDatabase() : super(_openConnection());
+  MyDatabase(QueryExecutor e) : super(e);
  // マイグレーションを行う場合に使用ため、テーブルを追加/変更/削除する場合はこの値をインクリメントする
  @override
  int get schemaVersion => 1;
}

上記のように修正することで、下記のように使用するデータベースの設定が変更できるようになります。
とはいえ、毎回コンストラクタに設定方法を渡すのは煩わしいので おまけに書いたやり方 のほうが好みです。

exsample
// SQLiteファイルを使う
fileDb = MyDatabase(_openConnection());

// メモリを使う
memoryDb = MyDatabase(NativeDatabase.memory());

テストコード

database_test.dart
import 'package:drift/native.dart';
import 'package:test/test.dart';

import 'package:src/database/database.dart'; // 自分のデータベースクラスをインポート

void main() {
  MyDatabase database;

  setUp(() {
    // データベースをメモリ上に展開
    database = MyDatabase(NativeDatabase.memory());
  });

  tearDown(() async {
    // テストが終了したらデータベースを削除
    await database.close();
  });
  
  test('some kind of test.', () async {
    // ここにテストコードを書く
  });

}

おまけ

ここではMyDatabaseを変更前と同じ使い方をしつつ、テストでも使用できるようにする方法を紹介します。
このやり方が正しいのかわからないので、間違っていたら指摘いただけると嬉しいです。

database.dart
@DriftDatabase(tables: [Todos, Categories])
class MyDatabase extends _$MyDatabase {
-  // コンストラクタでDBの保存先を定義する
-  MyDatabase(QueryExecutor e) : super(e);
+ // コンストラクタを隠蔽
+  MyDatabase._(QueryExecutor e) : super(e);

+  // SQLite用のファクトリー
+  // factory constractorを利用してコンストラクタを再定義
+  factory MyDatabase() {
+    return MyDatabase._(_openConnection());
+  }
+
+  // テスト用のファクトリー
+  // factory constractorをテスト用のメモリを使用するコンストラクタを定義
+  factory MyDatabase.memory() {
+    return MyDatabase._(NativeDatabase.memory());
+  }
+  // テスト用のファクトリー
+  // factory constractorをテスト用のメモリを使用するコンストラクタを定義
+  factory MyDatabase.fotTest(QueryExecutor e) {
+    return MyDatabase._(e);
+  }


  @override
  int get schemaVersion => 1;
}

exsample
// SQLiteファイルを使う
- fileDb = MyDatabase(_openConnection());
+ fileDb = MyDatabase(); 

// メモリを使う
- memoryDb = MyDatabase(NativeDatabase.memory());
+ memoryDb = MyDatabase.memory();
コピペしたい人用

公式ドキュメントをそのまま翻訳しただけのものですが、載せておきます。

database.dart
@DriftDatabase(tables: [Todos, Categories])
class MyDatabase extends _$MyDatabase {
  // コンストラクタを隠蔽
  MyDatabase._(QueryExecutor e) : super(e);

  // SQLite用のファクトリー
  // factory constractorを利用してコンストラクタを再定義
  factory MyDatabase() {
    return MyDatabase._(_openConnection());
  }

  // テスト用のファクトリー
  // factory constractorをテスト用のメモリを使用するコンストラクタを定義
  factory MyDatabase.memory() {
    return MyDatabase._(NativeDatabase.memory());
  }
  // テスト用のファクトリー
  // factory constractorをテスト用のメモリを使用するコンストラクタを定義
  factory MyDatabase.fotTest(QueryExecutor e) {
    return MyDatabase._(e);
  }

  @override
  int get schemaVersion => 1;
}
database_test.dart
import 'package:drift/native.dart';
import 'package:test/test.dart';

import 'package:src/database/database.dart'; // 自分のデータベースクラスをインポート

void main() {
  MyDatabase database;

  setUp(() {
    // データベースをメモリ上に展開
    database = MyDatabase.memory();
  });

  tearDown(() async {
    // テストが終了したらデータベースを削除
    await database.close();
  });
  
  test('some kind of test.', () async {
    // ここにテストコードを書く
  });

}

Driftを使ってみたメモ

今までDriftを使ってきてのメモです。

初期構築編

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0