Модульное тестирование в Objective C -> как скопировать базу данных sqlite
У меня возникли проблемы с запуском моего тестового набора. По сути, я добавил новую цель в свое приложение, например так:
Поскольку я хочу проверить мои DA-классы и sqlite-database, я использую следующий фрагмент кода для копирования базы данных:
// First, test for existence.
BOOL success;
NSFileManager *fileManager = [NSFileManager defaultManager];
NSError *error;
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:DATABASE_Path];
success = [fileManager fileExistsAtPath:writableDBPath];
if (success) return;
// The writable database does not exist, so copy the default to the appropriate location.
NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:DATABASE_Path];
success = [fileManager copyItemAtPath:defaultDBPath toPath:writableDBPath error:&error];
if (!success) {
NSAssert1(0, @"Failed to create writable database file with message '%@'.", [error localizedDescription]);
}
но, как кажется, NSBundle не возвращает путь к базе данных, как ожидалось.
Есть ли простой способ исправить это? Я не смог исправить это за последние пару часов - так что мой следующий выстрел - вы, ребята.
Любая помощь или предложение высоко ценится!
Большое спасибо!
Том
1 ответ
Я просто затронул ту же проблему, унаследовав некоторый код, который делает доступ к сырому sqlite очень похожим образом.
Здесь есть две проблемы, и они ответили в другом месте на SO.
Во-первых, во время тестирования NSBundle mainBundle не возвращает то, что вы думаете, если вы хотите, чтобы код, который зависит от NSBundle mainBundle, работал во время модульного тестирования, вы можете заменить его на
[NSBundle bundleForClass: [self class]]
Я не уверен, что это менее эффективно (вероятно), но он работает в модульном тесте.
Вторая проблема заключается в том, что на каталог документов не ссылаются правильно, так как внутри песочницы не выполняется модульный тест. Есть несколько способов исправить это, но самый простой - просто создать каталог документов в ~/Library/Application Support/iPhone Simulator/6.1/. Очевидно, что 6.1 является лишь примером.
Рекомендации:-
NSHomeDirectory в модульном тестировании iPhone
Кстати, я просто люблю отвечать на старые вопросы.