我是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类,因为在这种情况下我不关心数据模型。
感谢您的建议。
问候。
答案 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上面描述的模式与他在第二个链接中所做的更为一致。