Как сделать UnitTests с CoreData? - PullRequest
       21

Как сделать UnitTests с CoreData?

9 голосов
/ 13 апреля 2011

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

Теперь я решил, что мне нужно несколько «модульных» тестов для проверки правильности манипулирования моделью данных ядра (до сих пор я делал только ручные проверки и проверял базу данных напрямую с помощью CoreDataEditor). Я следовал

http://developer.apple.com/library/ios/#documentation/Xcode/Conceptual/iphone_development/135-Unit_Testing_Applications/unit_testing_applications.html

о том, как настроить UnitTests в Xcode. Пока это работает как для логики, так и для тестов приложений. Однако я не могу заставить "модульные" тесты работать с бэкэндом CoreData (он не находит мою модель данных, и я не знаю, что включить или связать и т.д. ...)

Есть ли указатель / описание того, как выполнить "модульное" тестирование приложения iphone для основных данных?

PS: я знаю, что тестирование с помощью серверной части базы данных не является строго "модульным" тестированием. Меня не волнует, находится ли тест на симуляторе с реальным приложением (ApplicationTesting) или это просто базовая база данных специально для модульных тестов (LogicTest), которую я заполнил бы некоторыми тестовыми объектами во время setUp.

РЕДАКТИРОВАТЬ: Я нашел Как провести модульное тестирование моих моделей сейчас, когда я использую Core Data? и http://chanson.livejournal.com/115621.html но теперь я столкнулся с проблемой, описанной в iPhone UnitTesting Значение UITextField и ошибка otest 133 ... хорошо, за исключением того, что у меня есть код ошибки 134: - (((Есть идеи?

1 Ответ

11 голосов
/ 14 апреля 2011

OK. Я получил это работает ...

  1. Создайте LogicTests, как описано здесь (раздел Настройка Logic Testing): http://developer.apple.com/library/ios/#documentation/Xcode/Conceptual/iphone_development/135-Unit_Testing_Applications/unit_testing_applications.html

  2. Вручную добавьте CoreData.framework во вновь созданную цель для логических тестов: перетащите ее из цели приложения в цель логического теста (папка «связать двоичный файл с библиотеками»).

  3. Щелкните правой кнопкой мыши на * .xcdatamodeld и выберите Get Info -> Targets. Выберите цель Logic Tests (по какой-то странной причине фактическая цель приложения не была выбрана в моем случае ... но это работает)

  4. В вашем классе модульного тестирования (вы создали на шаге 1: LogicTests.m) добавьте следующий метод:

    - (void) setUp {
    
       NSArray *bundles = [NSArray arrayWithObject:[NSBundle bundleForClass:[self class]]];
       NSManagedObjectModel *mom = [NSManagedObjectModel mergedModelFromBundles:bundles];
       STAssertNotNil(mom, @"ManangedObjectModel ist nil");
    
       NSPersistentStoreCoordinator *psc = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:mom];
       STAssertTrue([psc addPersistentStoreWithType:NSInMemoryStoreType configuration:nil URL:nil options:nil error:NULL] ? YES : NO, @"Should be able to add in-memory store");    
    
       self.context = [[NSManagedObjectContext alloc] init];
       self.context.persistentStoreCoordinator = psc;
    
       [mom release];
       [psc release];
    }
    

Теперь у вас настроен логический тест с поддержкой основных данных. Логическое тестирование выполняется изолированно (без симулятора) путем создания цели LogicTests. Для этого создается временная база данных в памяти. В ваших тестовых методах вы можете теперь сделать что-то вроде:

- (void) testStuff {    
     NSManagedObject *managedObj = [NSEntityDescription insertNewObjectForEntityForName:@"Account" inManagedObjectContext:self.context];

     [managedObj setValue:[NSNumber numberWithInt:90000] forKey:@"id"];

     NSError *error = nil;
     if (![self.context save:&error]) {
         STFail(@"Fehler beim Speichern: %@, %@", error, [error userInfo]);
     }
}

Надеюсь, это поможет .... Веселитесь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...