我正在开发一个使用核心数据从 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: A fetch request must have an entity..
如果我从我的测试用例包中不包含的类执行上述方法,比如 appDelegate,它工作正常。
如果我做错了什么,谁能建议我?