iOS单元测试与核心数据/ MagicalRecord意外行为

时间:2014-05-20 12:12:10

标签: ios core-data magicalrecord

我得到了以下测试代码。

@interface SubscriberTest : XCTestCase

@end

@implementation SubscriberTest

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

}


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

- (void)testParseSubscriberWithEvents
{
   NSEntityDescription *pDesc = [NSEntityDescription entityForName:@"Subscriber"
                                         inManagedObjectContext:[NSManagedObjectContext MR_defaultContext]];
   XCTAssertNotNil(pDesc);


- (void)testParseSubscriberWithReviews
{
   NSEntityDescription *pDesc = [NSEntityDescription entityForName:@"Subscriber"
                                         inManagedObjectContext:[NSManagedObjectContext MR_defaultContext]];
    XCTAssertNotNil(pDesc);

}

@end

我不明白为什么第一次测试总是成功而第二次测试总是失败.. 就像每个测试创建的都是自己的ManagedObjectContext,但第二个不知道我的实体...... 实际上,此代码用于测试json数据的导入。我调试了MagicalRecord的代码,看看问题来自方法

[NSEntityDescription entityForName: inManagedObjectContext:]

在第二次测试中返回nil ...

我试着评论第一次测试,第二次测试有效!但如果他们是两次测试,那么第二次失败......

有关我正在使用MagicalRecord 2.3.0.beta的信息(由于2.2 importFromObject方法中的一些错误......) 任何帮助和解释将不胜感激!

1 个答案:

答案 0 :(得分:1)

看起来在第一次测试后-tearDown会破坏CoreData堆栈,由于某种原因,下次调用-setUp时,MagicalRecord无法正确初始化Core Data堆栈(第二次上下文为nil,如您所示),导致第二次测试失败。我发现如果你设置一次核心数据堆栈(你可以通过在-setUp中调用dispatch_once来实现这一点)并在-tearDown中调用[Subscriber MR_truncateAll]它确实有效。