Тестирование модуля в Objective C → как скопировать базу данных sqlite

У меня есть немного проблем с тем, чтобы запустить свой тестовый пакет. В основном я добавил новую цель для своего приложения, например: Приложения для тестирования модулей

Поскольку я хочу протестировать свои DA-классы и базу данных sqlite, я использую следующие файлы для копирования базы данных:

// 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]]

Я не уверен, что это менее эффективно (возможно), но он работает в модульном тесте.

Вторая проблема заключается в том, что каталог документов не получает ссылки правильно, так как unit тест не выполняется внутри поля для песка. Есть несколько способов исправить это, но проще всего создать каталог документов в ~/Library/Application Support/iPhone Simulator/6.1/. Очевидно, что 6.1 является просто примером.

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

OCUnit & NSBundle

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

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

licensed under cc by-sa 3.0 with attribution.