2012-01-21 2 views
1

나는 가져 오기 요청 중 하나에서 NSPredicate를 사용하는 핵심 데이터 응용 프로그램을 가지고 있습니다.조롱 된 개체로 실패한 NSPredicate를 디버깅하는 방법?

NSDictionary *teamsParams = [NSDictionary dictionaryWithObject:teamArray forKey:@"TEAMS"]; 
NSPredicate *predicate = [[NSPredicate predicateWithFormat:@"(homeTeam IN $TEAMS) AND (awayTeam IN $TEAMS)"] predicateWithSubstitutionVariables:teamsParams] 

내가 요청을 가져오고 실행이 술어를 적용하고 내가 예상대로 작동 : 적어도 내가이 나의 데이터 저장소에있는 데이터의 제한된 양의 작동은 다음과 같이 그 조건이 정의된다 시각.

이제이 코드에 대한 단위 테스트 집합을 작성하려고합니다. 그래서 기본적으로

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을 위해 노력하고 있어요 : 나는 그것의 executeFetchRequest 내 자신의 테스트 구현 밖으로 스텁와 함께 NSManagedObjectContext를 만들 OCMock을 사용하고이 작업을 수행하려면 , 그리고 조롱 된 객체의 배열에 대해 그것을 실행합니다. 조롱 된 객체는 모두 술어와 관련하여 homeTeam 및 awayTeams 메소드를 구현하므로 작동해야합니다. 불행히도, 내 dta 배열에 대해 filteredArrayUsingPredicate를 실행하면 빈 배열이 반환됩니다. 나는 이것을 파악하려고 애 쓰고 있는데, 어떻게 효과적으로 디버깅 할 지 모르겠다.

그래서 난 정말, 여기에 두 가지 질문이 있습니다

  1. 가에서 참조 속성을 구현하는 mock 객체 (AN NSProxy의 서브 클래스의 인스턴스)의 배열에 대해 filteredArrayUsingPredicate를 사용하는 이유가 여기에 누락 이유가 있나요 술부?
  2. 명백한 이유가 없다고 가정하면 누구나 필터링 된 내용을 볼 수있는 효과적인 방법을 제안 할 수 있습니다. filteredArrayUsingPredicate는 여기에서 평가하고 있으며 그 이유는 무엇입니까? 당신이 제공 할 수있는 모든 도움을

덕분에

+0

Tim 속성은 사용자가 직접 작성했으며 로깅을 추가했습니다. 그들이 필터에 의해 호출되는 것을 볼 수 있습니까? Andrew – adonoho

+0

OCMock을 사용하여 메소드를 스텁 아웃 (stub)하는 방법으로 실제로 mock 객체에 접근자를 작성하지 않기 때문에 호출 여부를 결정하기가 다소 어려웠습니다. 그러나 많은 재판을 통해 액세스하는 속성을 스터 빙하는 다른 방법으로 오류가 발생하면 접근자가 실제로 호출되지 않았 음을 확인할 수있었습니다. 액세스하려고 시도한 각 속성에 대해 valueForKey 메서드를 추가로 추가해야했습니다. –

답변

3

여기 무슨 일이 일어 났는지의 대부분을 파악하는 것을 처리했다. 필자가 여기서 직면 한 가장 큰 문제점은 "homeTeam"과 같은 용어가 포함 된 조건 자에 filteredArrayUsingPredicate를 사용하면 내 array 객체가 "homeTeam"키를 사용하여 valueForKey 메소드를 호출하여이 조건 자에 대해 평가된다는 것입니다. 이 valueForKey 호출이 homeTeam 접근 자 메서드의 값을 반환 할 것으로 예상했지만 내 모의 개체와 관련이없는 이유가 무엇인지 (즉, 아직 이해할 수없는 부분입니다)

일단 내가 내 모의 객체에 valueForKey 메서드를 추가 한 다음 OCMock 버그 (또는 제한 사항)을 통해 here 문서를 작성 했으므로 테스트 결과를 얻을 수있었습니다.