我正在开发一个应用程序,它使用核心数据从sqlite db存储和检索数据。为此,我创建了一个单独的类,其作用类似于数据链接层 - LocalDBController
下面是其中一个方法的实现--selectAddressWithAddressId:
- (NSDictionary *)selectAddressWithAddressId:(NSString *)addressId
{
NSDictionary *dictToReturn = nil;
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"address_id == %@",addressId];
NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Address" inManagedObjectContext:self.moc]; // returning nil when invoked from test case class
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:entityDescription];
[request setPredicate:predicate];
NSError *err = nil;
NSArray *array = [self.moc executeFetchRequest:request error:&err];
// some more code...
return dictToReturn;
}
现在我正在尝试为它实现一个测试用例类(SenTestCase类)。
我在LocalDBController类中编写了下面的init方法,因此如果环境变量的值为'Run',它使用默认持久存储,如果环境变量的值为'Test',则使用内存持久存储:
- (id)init
{
if (self = [super init]) {
// initializing moc based on if run setting is used or test is used
if ([[[[NSProcessInfo processInfo] environment] objectForKey:@"TARGET"] isEqualToString:@"TEST"]) {
NSManagedObjectModel *mom = [NSManagedObjectModel mergedModelFromBundles:nil];
NSPersistentStoreCoordinator *psc = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:mom];
[psc addPersistentStoreWithType:NSInMemoryStoreType configuration:nil URL:nil options:nil error:NULL];
self.moc = [[NSManagedObjectContext alloc] init];
self.moc.persistentStoreCoordinator = psc;
}
else
{
self.moc = [(AppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];
}
}
return self;
}
在我的测试类中,我试图调用以下方法:
STAssertNotNil([self.localDBController selectAddressWithAddressId:@"123"], @"No data found");
问题是 -
在这种情况下, selectAddressWithAddressId:方法中获得的 entityDescription 的值为nil,尽管self.moc的值不是nil。所以 在控制台中抛出此异常消息:引发 executeFetchRequest:error:获取请求必须具有实体..
如果我从我的测试用例包中没有包含的类执行上面的方法,比如appDelegate,它可以正常工作。
如果我做错了什么,有人可以建议我吗?