iphone – 单元测试是否应该使用不同的托管对象上下文到主应用程序?

所有托管对象上下文代码都位于我的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;
}
点赞