1

我正在开发一个使用核心数据从 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,它工作正常。

如果我做错了什么,谁能建议我?

4

0 回答 0