我有一个非常标准的Xcode生成的Core Data对象接口,即我的应用程序委托中的以下属性:
@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;
@property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel;
@property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;
现在,我正在编写应用程序测试,但是我想使用内存数据库存储每次测试运行时都会重置的核心数据。我想出了一种方法来做,但是感觉完全很棘手:
storeType
。 -persistentStoreCoordinator
如果是NSSQLiteStoreType
,则将其设置为nil
。这将是默认值,在生产环境中,这是唯一的值,可确保在运行应用程序时一切正常。 DEBUG
宏DEBUG
,则在应用程序委托-resetCoreData
中定义一个方法。该方法如下所示:#ifdef DEBUG
- (void)resetCoreData {
// Testing, we want to use the in memory store.
storeType = NSInMemoryStoreType;
// Disconnect core data.
__persistentStoreCoordinator = nil;
__managedObjectContext = nil;
// Set up defaults.
[self configureCoreDataDefaults];
}
#endif
请注意,它将静态变量
storeType
设置为NSInMemoryStoreType
。 -configureCoreDataDefaults
方法创建一些应始终存在的托管对象。 -setup
调用-resetCoreData
:- (void)setUp {
[super setUp];
[[[UIApplication sharedApplication] delegate] resetCoreData];
}
这给了我我想要的:新的核心数据存储,其中为每个测试方法都创建了默认对象。
但这很烦人。我实质上已经在我的应用程序委托中添加了有关测试环境的知识,以使其在运行应用程序测试时的行为有所不同。毛!
那么,有什么更好的方法呢?你怎么做呢?
最佳答案
我建议创建一个DAO或类似的东西来隔离核心数据设置。然后,使用类别,您可以在测试目标中定义和使用此“resetCoreData”。