2013-07-09 2 views
4

У меня есть приложение для iOS, которое использует Core Data вместе с отличным Magical Record для управления сохранением. Вот моя проблема:Тестирование модульного приложения iOS с основными данными и магическая запись

Наша существующая структура тестирования модулей использует стандартные тесты приложений на iOS. Я хочу запускать свои модульные тесты с чистым in-memory db для каждого теста. Я выполнил указания в this article, чтобы установить это с помощью Magical Record. Проблема возникает при выполнении тестов приложений. Так как тесты приложений сначала запускают пакет приложений, а затем набор тестовых модулей, мой обычный вызов для настройки базового стека данных вызывается до того, как у меня появится вызов для хранения в памяти.

Я гугле этот вопрос всю ночь, и нашел пару перспективных статей:

Проблема с этим является то, что они используют одноэлементный объект доступа к данным как шлюз в свои основные вызовы данных. Мое приложение не настроено таким образом. Я использую вызовы в Magical Record для сбора и сохранения данных.

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

EDIT: Добавление кода

В моем приложении делегат, у меня есть это:

-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{ 
    [MagicalRecord setupAutoMigratingCoreDataStack]; 
    // Other setup code 
    return YES; 
} 

В каждом единичном тестовом классе, который имеет дело с основными данными, у меня есть это:

-(void)setUp{ 
    [super setUp]; 
    [MagicalRecord setDefaultModelFromClass:[self class]]; 
    [MagicalRecord setupCoreDataStackWithInMemoryStore]; 
} 

-(void)tearDown{ 
    [MagicalRecord cleanUp]; 
    [super tearDown]; 
} 

Я вижу, что для каждого теста вызывается как код делегирования приложения, так и настройка/разрывы, но я не уверен, как создать стандартный стек данных ядра для tes ts использовать память в памяти. У меня также есть файл .xcdatamodel, добавленный к целевому объекту тестирования.

+0

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

+0

@casademora - Добавлен код, иллюстрирующий, как я делаю вещи. Я также использую CocoaPods, чтобы вытащить магическую запись, не уверен, что это может иметь какое-либо отношение к проблеме. –

+1

hrm, вам нужно запускать тесты приложений? В этом случае вам не нужно использовать тестовую настройку. Если вы используете логические тесты, настройка, указанная в сообщении в блоге, отлично работает. Кроме того, я ненавижу, что существует различие между прикладными и логическими тестами:/ – casademora

ответ

0

Если я правильно понимаю вашу проблему, проблема в том, что даже после вызова [MagicalRecord setupCoreDataStackWithInMemoryStore]; в setUp тестах обращаются к реальному хранилищу данных?

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

[MagicalRecord setupAutoMigratingCoreDataStack]; в - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions называется более [MagicalRecord setupCoreDataStackWithInMemoryStore]; в setUp. И если мы посмотрим, как работает основной стек данных с помощью MagicalRecord, мы поймем, в чем проблема.

+ (void) setupCoreDataStackWithInMemoryStore; 
{ 
    if ([NSPersistentStoreCoordinator MR_defaultStoreCoordinator] != nil) return; 

    NSPersistentStoreCoordinator *coordinator = [NSPersistentStoreCoordinator MR_coordinatorWithInMemoryStore]; 
    [NSPersistentStoreCoordinator MR_setDefaultStoreCoordinator:coordinator]; 

    [NSManagedObjectContext MR_initializeDefaultContextWithCoordinator:coordinator]; 
} 

[NSPersistentStoreCoordinator MR_defaultStoreCoordinator] не ноль в точке установки в памяти магазина и что делает выше метод молча вернуться, ничего не делая. И в этот момент вы остаетесь с вашим реальным хранилищем данных вместо хранилища в памяти. Решение прост.Просто позвоните

[MagicalRecord cleanUp]; 

перед вызовом в [MagicalRecord setupCoreDataStackWithInMemoryStore]; в setUp разорвать текущий стек данных и действительно создать в памяти магазин поэтому он должен выглядеть следующим образом:

- (void)setUp{ 
    [super setUp]; 
    [MagicalRecord setDefaultModelFromClass:[self class]]; 
    [MagicalRecord cleanUp]; 
    [MagicalRecord setupCoreDataStackWithInMemoryStore]; 
}