Модульное тестирование в 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 является лишь примером.

Рекомендации:-

OCUnit & NSBundle

NSHomeDirectory в модульном тестировании iPhone

Кстати, я просто люблю отвечать на старые вопросы.

Другие вопросы по тегам