带有核心数据/MagicalRecord 意外行为的 iOS 单元测试

Posted

技术标签:

【中文标题】带有核心数据/MagicalRecord 意外行为的 iOS 单元测试【英文标题】:iOS unit test with core data/MagicalRecord unexpected behavior 【发布时间】:2014-05-20 12:12:09 【问题描述】:

我得到了以下测试代码。

@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);


@结束

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

[NSEntityDescription entityForName: inManagedObjectContext:]

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

我试图评论第一个测试,第二个测试成功了!但是如果他们是两个测试,那么第二个每次都失败......

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

【问题讨论】:

你能把一个项目放在能重现这个问题的地方吗?我刚刚用这个设置创建了一个最小的项目,它工作正常 【参考方案1】:

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

【讨论】:

以上是关于带有核心数据/MagicalRecord 意外行为的 iOS 单元测试的主要内容,如果未能解决你的问题,请参考以下文章

核心数据合并行为

带有背景上下文的核心数据通知

MagicalRecord:删除整个数据并再次设置核心数据堆栈

无法在具有 MagicalRecord [核心数据] 的实体中分配给 ...

MagicalRecord 重新启动应用程序时删除核心数据存储

使用 MagicalRecord 进行核心数据加密