我有一个非常标准的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。这将是默认值,在生产环境中,这是唯一的值,可确保在运行应用程序时一切正常。
  • 我确保为所有调试版本(包括我的App Tests目标)设置了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”。

    08-05 23:45
    查看更多