Как отладить NSP-предикат, который не работает с макетами объектов? - PullRequest
1 голос
/ 21 января 2012

У меня есть приложение с основными данными, которое использует 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 он возвращает пустой массив. Я действительно застрял, пытаясь выяснить это, и я не уверен, как эффективно отладить это.

Итак, у меня есть два вопроса, действительно:

  1. Есть ли здесь причина, по которой мне не хватает, почему при использовании FilterArrayUsingPredicate используется массив фиктивных объектов (экземпляров подкласса NSProxy), которые реализуют свойства, указанные в предикате?
  2. Предполагая, что нет очевидных причин, может кто-нибудь предложить эффективный способ отладки этого, чтобы увидеть, что он фильтрует, ArrayUsingPredicate оценивает здесь и почему он мне не удался?

Спасибо за любую помощь, которую вы можете оказать

1 Ответ

3 голосов
/ 22 января 2012

Мне удалось выяснить большую часть того, что здесь происходит. Основная проблема, с которой я здесь столкнулся, заключается в том, что когда я использую FilterArrayUsingPredicate с предикатом, содержащим термин «homeTeam», мои объекты массива сравниваются с этим предикатом, вызывая их метод valueForKey с ключом «homeTeam». Я ожидал, что этот вызов valueForKey вернет значение метода доступа homeTeam, но по какой-то причине этого не происходит с моими фиктивными объектами (это часть, которую я до сих пор не понимаю по этому поводу)

Как только я поставил метку valueForKey над моими фиктивными объектами, а затем работал с ошибкой OCMock (или ограничением?), Задокументированной здесь , я смог заставить свои тесты работать,

...