フェッチ要求の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つの質問があります
- はで参照のプロパティを実装するモックオブジェクト(NSProxyサブクラスのインスタンス)の配列に対してfilteredArrayUsingPredicateを使用して、なぜ私はここに欠けている理由があります述語?
- 明白な理由がないと仮定すると、誰でも、これをデバッグする効果的な方法を提案して、filteredArrayUsingPredicateがここで評価している理由とそれがなぜ私のために失敗したのかを確認できますか?
あなたは私がここで起こっていたのほとんどを把握するために管理している
Timこれらのプロパティは独自のアクセサを作成してログを記録しました彼らはフィルタによって呼び出されていることを確認するには? Andrew – adonoho
OCMockを使用してメソッドをスタブしているので、モックオブジェクトにアクセサーを実際に記述しないので、呼び出されているかどうかを判断するのは少し難しかったです。しかし、多くの試行の後、私がアクセスしているプロパティをスタブする別の方法でエラーが発生したため、アクセサーが実際に呼び出されていないことを確認できました。私はアクセスしようとしていた各プロパティのvalueForKeyメソッドを追加でスタブしなければなりませんでした。 –