NSManagedObject的单元测试[GHUnit]

时间:2012-11-09 09:28:47

标签: ios unit-testing nsmanagedobject gh-unit

我是Java开发人员,我曾经将我的Java实体测试为POJO。现在,使用Obj-C,我想对从NSManagedObject继承的实体做同样的事情(我使用CoreData进行持久化)。

例如,我想测试我的客户实体:

-(void)myTest {
Customer *customer = [Customer alloc] init];
customer.name = @"toto";
GHAssertEqualStrings(customer.name, @"toto", @"");
}

但我遇到的错误是:

NSInvalidArgumentException 原因: - [客户setName:]:无法识别的选择器已发送至实例...

所以我已经使用适当的数据库模式url加载了setUp中的所有NSManagedObjectContext。现在我将我的客户实例化,并且有效:

Customers *customer = [NSEntityDescription
insertNewObjectForEntityForName:kDataBaseCustomerKey inManagedObjectContext:ctx];

但这是测试'POJO'的合适方式吗?我想在没有任何模型加载的情况下测试我的Customer类,因为在这种情况下我不关心数据模型。

感谢您的建议。

问候。

1 个答案:

答案 0 :(得分:5)

这取决于您正在测试的内容。从概念上将Core Data模型与现实中的实现分离起来有点困难;所以我通常在单元测试代码中构建自己的堆栈。另一方面,如果您真的在测试的代码只依赖于NSManagedObject子类的实现,那么我认为您已经概述的方法没有任何问题。

作为参考,如果您对如何为单元测试重新创建堆栈感兴趣,请按照以下方式进行操作。 (我只是注意到您使用GHUnit而不是OCUnit - 它应该是相同的,但您可能需要确保模型包含在{{1的捆绑资源中app。

创建一个继承自GHUnit的类,并使用SenTestCase构建核心数据堆栈:

NSInMemoryStoreType

所有触及Core Data的测试用例都应该从这个子类继承。鉴于您正在使用内存存储类型,并且您在每次测试时构建并拆除模型,您可以最小化任何依赖关系,并从每个测试的未填充模型开始。当然,没有关于表现的承诺。

修改

我在使用Core Data对象的单元测试时发现这篇文章很有帮助 - Unit testing Core Data-driven apps

编辑2:

Graham Lee(上述帖子的作者)还有一篇关于单元测试核心数据对象的文章,该文章不依赖于模拟。请参阅this one上面描述的模式与他在第二个链接中所做的更为一致。