はじめに
FlutterにDriftを導入したときの手順を残しておきます。
今回はテストを書いたときについてです。
本記事は以下の公式ドキュメントを参考にしています。
詳しいことが知りたい方はこちらを参照してください。
環境
テスト用の設定
テストでメモリ上にデータベースを展開できるようにするために、コンストラクタで設定を受け取れるように修正しておきます。
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を使ってきてのメモです。
初期構築編