NSManageBject [Ghunit]的单元测试



我是Java开发人员,我曾经将Java实体作为Pojo测试。现在,使用OBJ-C,我想为我的实体做同样的事情,该实体从nsmanagedObject继承(我将coredata用于持久性)。

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

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

但是我遇到的错误是:

nsinvalidargumentException原因: - [客户setName:]:未识别的选择器已发送到实例...

因此,我已经使用适当的数据库模式URL加载了设置中的所有NSManageBjectContext。现在,我实例化了我的客户,并且可以正常工作:

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

但是,这是测试A 'pojo'的合适方法吗?我想在没有任何模型加载的情况下测试我的客户类,因为在这种情况下,我不在乎DataModel。

谢谢您的建议。

问候。

这取决于您要测试的内容。从概念上讲,将核心数据模型与现实生活中的实现分开是很难的。因此,我通常在单位测试代码中构建自己的堆栈。另一方面,如果您实际测试仅取决于NSManagedObject子类实现的代码,那么我认为您概述的方法没有错。

供参考,如果您对如何重新创建单位测试的堆栈感兴趣,这就是我的工作方式。(我只是注意到您使用的是GHUnit而不是OCUnit-应该是相同的,但是您可能需要确保该模型包含在GHUnit App的捆绑资源中。

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

@implementation CCFCoreDataTestCase {
    NSManagedObjectModel *_mom;
    NSPersistentStoreCoordinator *_psc;
    NSManagedObjectContext *_moc;
    NSPersistentStore *_store;
}
@synthesize managedObjectContext = _moc;
- (void)setUp {
    [super setUp];
    NSArray *bundles = [NSArray arrayWithObject:[NSBundle bundleForClass:[self class]]];
    _mom = [NSManagedObjectModel mergedModelFromBundles:bundles];
    _psc = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:_mom];
    _store = [_psc addPersistentStoreWithType:NSInMemoryStoreType configuration:nil URL:nil options:nil error:NULL];
    STAssertNotNil(_store,@"Unable to create in-memory store");
    _moc = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
    [_moc setPersistentStoreCoordinator:_psc];
}
- (void)tearDown {
    [super tearDown];
    _mom = nil; _psc = nil; _moc = nil; _store = nil;
}

所有接触核心数据的测试用例应从此子类继承。鉴于您使用的是内存中的商店类型,并且在每个测试中构建和拆除模型,因此您可以最大程度地减少任何依赖项,并从每个测试的不被人体的模型开始。当然,没有关于性能的承诺。

编辑:

我在处理核心数据对象的单元测试时发现了这篇文章 - 单元测试核心数据驱动的应用

编辑2:

格雷厄姆·李(Graham Lee)(上文帖子的作者)还有另一个有关单元测试核心数据对象的文章,该对象不依赖嘲笑。请参阅我上面描述的模式与他在第二个链接中所做的工作更一致。

相关内容

  • 没有找到相关文章

最新更新