CoreDataと違い、直接SQLiteを扱うためのライブラリであるFMDBを扱ったテストのセットアップ例を書いてみました。
テストフレームワークにKiwiを使っていますが、どのテストフレームワークもsetup/teardownは持ってるので同じことができます。
SQLManagerSpec.m がテストファイルです。
#define DATA_BASE_FILE_PATH @"/tmp/tmp.sqlite"
@interface SQLManagerSpec : KWSpec
@end
@implementation SQLManagerSpec
+ (void)buildExampleGroups {
describe(@"SQLManager", ^{
__block FMDatabase *fmDatabase;
beforeEach(^{
fmDatabase = [self database];
[fmDatabase open];
});
afterEach(^{
[fmDatabase close];
[self cleanup];
});
});
}
+ (FMDatabase *)database {
FMDatabase *fmDatabase = [FMDatabase databaseWithPath:DATA_BASE_FILE_PATH];
return fmDatabase;
}
+ (void)cleanup {
NSFileManager *fileManager = [NSFileManager defaultManager];
if (![fileManager fileExistsAtPath:DATA_BASE_FILE_PATH]) {
return;
}
NSError *error = nil;
[fileManager removeItemAtPath:DATA_BASE_FILE_PATH error:&error];
if (error) {
NSLog(@"%@", [error localizedDescription]);
}
}
@end
テストの中身は省略してますが、beforeEach/afterEachが毎回テストの前後で実行される処理ですね。
beforeEachでデータベースファイルを開いて、afterEachでデータベースを閉じてデータベースを削除しています。
CoreDataのようにメモリストアを使う方法がわかればそちらでもいい気がします。(FMDB初めて使ったのでよくわからなかった)
DATA_BASE_FILE_PATHを絶対パスにしているのは、ファイル名だけだと多分ロジックテストの制約に引っかかったからだと思います。
CoreDataだと以下の記事を参考にすれば、同じようなことができます
MagicalRecordを使った場合は以下のような感じです。
データベース周りは比較的テストを書きやすい部分なので積極的にテストを書いていくといいと思います。
テストをコマンドラインから実行する場合はxctoolがお勧めです。
azu/FMDB_test_setup · GitHub にもConfiguration (.xctool-args)が置いてあるので、xctool testとコマンドを叩けばCLIでテストが実行出来ます。
(まだCocoaPodsを完全にはサポートしてないので、ちょっと挙動おかしいですが Twitter / CocoaPods: ℹ xctool doesn’t support … )