2012-01-21 7 views
1

フェッチ要求の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メソッドを実装しています。これはうまくいくはずです。残念なことに、filteredArrayUsingPredicateをdta配列に対して実行すると、空の配列が返されます。私は本当にこれを把握しようとしているが、これを効果的にデバッグする方法がわからない。

だから私は本当に、ここでは2つの質問があります

  1. はで参照のプロパティを実装するモックオブジェクト(NSProxyサブクラスのインスタンス)の配列に対してfilteredArrayUsingPredicateを使用して、なぜ私はここに欠けている理由があります述語?
  2. 明白な理由がないと仮定すると、誰でも、これをデバッグする効果的な方法を提案して、filteredArrayUsingPredicateがここで評価している理由とそれがなぜ私のために失敗したのかを確認できますか?

あなたは私がここで起こっていたのほとんどを把握するために管理している

+0

Timこれらのプロパティは独自のアクセサを作成してログを記録しました彼らはフィルタによって呼び出されていることを確認するには? Andrew – adonoho

+0

OCMockを使用してメソッドをスタブしているので、モックオブジェクトにアクセサーを実際に記述しないので、呼び出されているかどうかを判断するのは少し難しかったです。しかし、多くの試行の後、私がアクセスしているプロパティをスタブする別の方法でエラーが発生したため、アクセサーが実際に呼び出されていないことを確認できました。私はアクセスしようとしていた各プロパティのvalueForKeyメソッドを追加でスタブしなければなりませんでした。 –

答えて

3

を提供することができる任意の助けてくれてありがとう。私がここで遭遇した主な問題は、 "homeTeam"などの用語を含む述語でfilteredArrayUsingPredicateを使用すると、配列オブジェクトが "homeTeam"キーでvalueForKeyメソッドを呼び出すことによってこの述語に対して評価されることです。私はこのvalueForKey呼び出しがhomeTeamアクセサメソッドの値を返すことを期待していましたが、なんらかの理由で私のモックオブジェクトで起きていないことがわかりました(これは私がまだこれについて理解していない部分です)

また、私のモックオブジェクトのvalueForKeyメソッドを使用して、OCMockのバグ(または制限?)を調べたところhereと書かれていました。