所有托管对象上下文代码都位于我的app委托中.我的单元测试类中是否应该有类似的代码? 最佳答案 对于单元测试,我专门为测试创建一个内存管理对象上下文.这样就可以在setUp代码中为每个测试销毁和重新创建它,因为它在内存中,节省速度很快.
**编辑**
MOC的东西封装在一个名为ModelLoader的类中.我从我的测试的-setUp中调用它,如下所示:
- (void)setUp
{
[super setUp];
loader = [[ModelLoader alloc] initWithName: @"MyDocument"];
NSError* error = nil;
if (![[loader context] save: &error])
{
@throw [NSException exceptionWithName: @"MOCSave"
reason: [error localizedDescription]
userInfo: nil];
}
}
名称是没有.mom扩展名的数据模型的名称. save和exception throw只是提供一个完整性检查,确保它是所有初始化属性.顺便说一句,这是GC代码.对于非GC,您需要在-tearDown中释放加载器
ModelLoader的相关代码:
-(id) init
{
return [self initWithName: @"MyDocument"];
}
-(id) initWithName: (NSString*) modelName
{
self = [super init];
if (self != nil)
{
NSBundle* theBundle = [self bundle];
NSURL* modelURL = [theBundle URLForResource: modelName
withExtension: MOM_EXTENSION];
if (modelURL == nil)
{
// log error
}
else
{
model = [[NSManagedObjectModel alloc] initWithContentsOfURL: modelURL];
if (model == nil)
{
// log error
}
}
}
return self;
}
// Create or return the context
-(NSManagedObjectContext*) context
{
if (context == nil)
{
context = [[NSManagedObjectContext alloc] init];
NSPersistentStoreCoordinator* coordinator
= [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self model]];
[context setPersistentStoreCoordinator: coordinator];
NSError* error = nil;
NSPersistentStore* newStore
= [coordinator addPersistentStoreWithType: NSInMemoryStoreType
configuration: nil
URL: nil
options: nil
error: &error];
if (newStore == nil)
{
NSLog(@"Failed to create store, reason %@", error);
context = nil;
}
}
return context;
}