У меня есть приложение с основными данными, которое использует NSPredicate в одном из запросов на выборку. Этот предикат определяется следующим образом:
NSDictionary *teamsParams = [NSDictionary dictionaryWithObject:teamArray forKey:@"TEAMS"];
NSPredicate *predicate = [[NSPredicate predicateWithFormat:@"(homeTeam IN $TEAMS) AND (awayTeam IN $TEAMS)"] predicateWithSubstitutionVariables:teamsParams]
Я применяю этот предикат к запросу выборки и запускаю его, и он работает так, как я ожидал: по крайней мере, он работает с ограниченным объемом данных, которые у меня есть в моем хранилище данных в настоящее время.
Я сейчас пытаюсь написать набор модульных тестов для этого кода. Чтобы сделать это, я использую OCMock для создания NSManagedObjectContext с его выполнением executeFetchRequest с моей собственной тестовой реализацией:
id contextMock = [OCMockObject mockForClass:[NSManagedObjectContext class]];
[[[contextMock stub] andCall:@selector(stubbedExecuteFetchRequest:error:) onObject:self] executeFetchRequest:[OCMArg any] error:(NSError * __autoreleasing *) [OCMArg anyPointer]];
- (NSArray *)stubbedExecuteFetchRequest:(NSFetchRequest *)request error:(NSError **)error {
// allGames is an array containing a list of "mocked" game instances
NSArray *result = [allGames filteredArrayUsingPredicate:[request predicate]];
return result;
}
Итак, в основном я пытаюсь взять NSPredicate, который был определен для выполнения запроса выборки основных данных, и запустить его для массива фиктивных объектов. Все фиктивные объекты реализуют методы homeTeam и awayTeams, поэтому с точки зрения предиката это должно работать. К сожалению, при запуске filterArrayUsingPredicate для моего массива dta он возвращает пустой массив. Я действительно застрял, пытаясь выяснить это, и я не уверен, как эффективно отладить это.
Итак, у меня есть два вопроса, действительно:
- Есть ли здесь причина, по которой мне не хватает, почему при использовании FilterArrayUsingPredicate используется массив фиктивных объектов (экземпляров подкласса NSProxy), которые реализуют свойства, указанные в предикате?
- Предполагая, что нет очевидных причин, может кто-нибудь предложить эффективный способ отладки этого, чтобы увидеть, что он фильтрует, ArrayUsingPredicate оценивает здесь и почему он мне не удался?
Спасибо за любую помощь, которую вы можете оказать