iphone - 如何使用核心数据进行单元测试?

标签 iphone unit-testing core-data

从 CoreData 模板开始,我构建了一个 iPhone 应用程序,它使用 CoreData 来操作数据模型。到目前为止有效...

现在我决定,我需要一些“单元”测试来检查核心数据模型是否正确操作(到目前为止我只进行了手动检查并直接使用 CoreDataEditor 检查数据库)。我已关注

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

关于如何在 Xcode 中设置 UnitTests。到目前为止,这对于逻辑和应用程序测试都有效。但是,我无法使用 CoreData 后端进行“单元”测试(它找不到我的数据模型,并且我不知道要包含或链接什么等...)

是否有关于如何对核心数据 iPhone 应用程序进行“单元”测试的指针/描述?

PS:我知道数据库后端测试严格来说并不是“单元”测试。我不关心测试是在具有真实应用程序的模拟器上进行的(ApplicationTesting),还是只是专门用于单元测试(LogicTest)的核心数据后端,我将在设置期间填充一些测试对象。<​​/p >

编辑:我发现 How to unit test my models now that I am using Core Data?http://chanson.livejournal.com/115621.html 但现在我遇到了中描述的问题 iPhone UnitTesting UITextField value and otest error 133 ...好吧,除了我有错误代码 134 :-((( 有什么想法吗?

最佳答案

好的。我让它工作了...

  1. 按照此处所述创建逻辑测试(设置逻辑测试部分): http://developer.apple.com/library/ios/#documentation/Xcode/Conceptual/iphone_development/135-Unit_Testing_Applications/unit_testing_applications.html

  2. 手动将 CoreData.framework 添加到新创建的逻辑测试目标:将其从应用程序目标拖动到逻辑测试目标(文件夹“链接二进制文件与库”)。

  3. 右键单击 *.xcdatamodeld 并选择获取信息 -> 目标。选择逻辑测试目标(由于某些奇怪的原因,在我的例子中没有选择实际的应用程序目标......但这有效)

  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]);
     }
}

希望这有帮助......玩得开心!

关于iphone - 如何使用核心数据进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5646854/

相关文章:

java - 保护和验证使用 REST 的 iPhone 应用程序的最佳安全框架?

ios - 表数据的用户 CoreData 关系

ios - 初始化核心数据 ManagedObjectContext

iphone - iTunes App 被拒绝

iphone - 从图像中读取文本 iPhone SDK

ruby-on-rails - 测试时按特定顺序加载 Rails fixture

unit-testing - Jest 进行 React 快照测试 - 失败的 Prop 类型 : Invalid prop `children` of type `string` supplied

iphone - 使用 NSFetchResultsController 更改模型时行不移动

iphone - NSInteger和int给出异常

javascript - Node JS Jasmine 使用 jasmine.any() 测试多种类型