5

我有一个 iOS 应用程序,它使用 Core Data 和出色的Magical Record来管理持久性。这是我的问题:

我们现有的单元测试结构使用标准的 iOS 应用程序测试。我想为每个测试使用一个干净的内存数据库来运行我的单元测试。我按照本文中的说明使用 Magical Record 进行设置。该问题出现在运行应用程序测试的实现中。因为应用程序测试首先运行应用程序包,然后是单元测试包,所以在我的内存存储调用有机会运行之前调用了我设置核心数据堆栈的正常调用。

我用谷歌搜索了这个问题一整夜,发现了几篇很有前途的文章:

这些问题是他们使用单例数据访问对象作为进入其核心数据调用的网关。我的应用程序不是这样设置的。我正在使用对 Magical Record 的调用来获取和保存数据。

有没有人遇到过这个问题?如果是这样,我是否遗漏了一些细节,这些细节允许我在测试运行时将数据设置交换到内存存储中?

编辑:添加代码

在我的应用程序委托中,我有这个:

-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
    [MagicalRecord setupAutoMigratingCoreDataStack];
    // Other setup code
    return YES;
}

在每个处理核心数据的单元测试类中,我都有这个:

-(void)setUp{
    [super setUp];
    [MagicalRecord setDefaultModelFromClass:[self class]];
    [MagicalRecord setupCoreDataStackWithInMemoryStore];
}

-(void)tearDown{
    [MagicalRecord cleanUp];
    [super tearDown];
}

我可以看到每个测试都调用了应用程序委托代码和设置/拆卸,但我不确定如何使测试的默认核心数据堆栈使用内存存储。我还将 .xcdatamodel 文件添加到单元测试目标中。

4

1 回答 1

0

如果我正确理解了您的问题,问题是即使在调用[MagicalRecord setupCoreDataStackWithInMemoryStore];测试后setUp访问真实数据存储?

在为负责数据库交互的对象编写单元测试并且几乎没有调试时,我遇到了同样的问题,我想我发现了一个问题。

[MagicalRecord setupAutoMigratingCoreDataStack];in- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions[MagicalRecord setupCoreDataStackWithInMemoryStore];in更早被调用setUp。如果我们看看 MagicalRecord 创建核心数据堆栈的实际工作原理,我们就会明白问题所在。

+ (void) setupCoreDataStackWithInMemoryStore;
{
    if ([NSPersistentStoreCoordinator MR_defaultStoreCoordinator] != nil) return;

    NSPersistentStoreCoordinator *coordinator = [NSPersistentStoreCoordinator MR_coordinatorWithInMemoryStore];
    [NSPersistentStoreCoordinator MR_setDefaultStoreCoordinator:coordinator];

    [NSManagedObjectContext MR_initializeDefaultContextWithCoordinator:coordinator];
}

[NSPersistentStoreCoordinator MR_defaultStoreCoordinator]在设置内存存储时不是 nil ,这使得上述方法可以在不执行任何操作的情况下静默返回。到那时,您只剩下真实的数据存储,而不是内存存储。解决方法很简单。打电话

[MagicalRecord cleanUp];

在调用[MagicalRecord setupCoreDataStackWithInMemoryStore];setUp撕裂当前数据堆栈并真正设置内存存储之前,它应该如下所示:

- (void)setUp{
    [super setUp];
    [MagicalRecord setDefaultModelFromClass:[self class]];
    [MagicalRecord cleanUp];
    [MagicalRecord setupCoreDataStackWithInMemoryStore];
}
于 2016-06-01T11:00:28.157 回答