9

我按照这篇很棒的文章进入了有关核心数据的单元测试。设置看起来很简单,只涉及一些视图代码行。

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

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

- (void)testSomeCalculationOnMyEntity;
{
    NSNumber *count = [MyEntity MR_numberOfEntities];
    // STAssert([testEntity customCalculation] == expectedValue, @"expected a good calculation");
}

@end

问题是,每次我通过调用(如上)检查核心数据的内存设置中的实体数量时,我都会得到对象的数量,这些对象存储在基于文件的设置中,它们是几千个对象。这是怎么发生的?我的意思是第二行表示内存中的行,不是吗?这种情况下应该返回 0 作为存储的对象数量。[MyEntity MR_numberOfEntities]setUp

感谢您的任何建议!

编辑:

@casademora 让我走上了正轨。以下工作设置现在对我来说很好。

- (void)setUp;
{
    [MagicalRecord cleanUp]; // This solved the mystery.

    // I don't now why I had to remove this line, though.
    // [MagicalRecord setDefaultModelWithClass:[self class]];

    [MagicalRecord setupCoreDataStackWithInMemoryStore];
}

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

- (void)testSomeCalculationOnMyEntity;
{
    NSNumber *count = [MyEntity MR_numberOfEntities];
    // STAssert([testEntity customCalculation] == expectedValue, @"expected a good calculation");
}

@end
4

2 回答 2

1

此处用于设置 Core Data 的方法不应该加载基于文件的存储。如果您使用调试器进入它,您应该会看到它使用 NSInMemoryStore 类型初始化持久存储协调器......最终。

我对为什么会发生这种情况的猜测可能是因为您没有向先前的测试用例添加 cleanUp 调用,导致先前的核心数据堆栈或持久存储在此测试中徘徊。

这是我一直用来对核心数据进行单元测试的确切代码设置,它从未为我加载过意外的持久存储。当您调试该方法时,请确保运行以下命令:

po [self persistentStores]

当您加载持久存储协调器时。如果有现有商店,这至少可以验证是否有一些预先存在的商店在附近闲逛。

于 2012-07-31T15:18:50.523 回答
1

您还可以添加在类初始化时执行一次的以下内容。这对我有用。

 +(void)setUp
   {
           [MagicalRecord cleanUp];
   }
于 2013-08-11T21:54:50.983 回答