Модульное тестирование в Objective C -> как скопировать базу данных sqlite - PullRequest
0 голосов
/ 12 декабря 2011

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

Поскольку я хочу проверить мои 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 не возвращает путь к базе данных, как ожидалось.

Есть ли простое исправление? Я не смог исправить это за последние пару часов - так что мой следующий выстрел - вы, ребята.

Любая помощь или предложение высоко ценится!

Большое спасибо!

Tom

1 Ответ

1 голос
/ 29 августа 2013

Я только что столкнулся с точно такой же проблемой, унаследовав некоторый код, который делает доступ к сырому sqlite очень похожим образом.

Здесь есть две проблемы, и они ответили в другом месте на SO.

Во-первых, во время тестирования NSBundle mainBundle не возвращает то, что вы думаете, если вы хотите, чтобы код, который зависит от NSBundle mainBundle, работал во время модульного тестирования, вы можете заменить его на

[NSBundle bundleForClass: [self class]]

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

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

Ссылки: -

OCUnit & NSBundle

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

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

...