2

テストしているコードには、NSPredicateがあり、配列をフィルタリングしています。

NSPredicate* predicate = [NSPredicate predicateWithFormat:@"status == %d || status == %d", FVFileReadyStatus, FVFileWaitingStatus];
[myArray filterUsingPredicate:predicate];

モックを返すメソッドがあり、最終的にはに追加されmyArrayます。 FVFileStatustypedef列挙型です。私は述語を使用しているので、述語はを呼び出しvalueForKeyているので、それをスタブする必要があります:

-(id)mockFVFileHandleWithStatus:(FVFileStatus)status {
    id mock = [OCMockObject mockForClass:[FVFileHandle class]];
    [[[mock stub] andReturnValue:OCMOCK_VALUE(status)] valueForKey:[OCMArg checkWithSelector:@selector(isEqualToString:) onObject:@"status"]];
    return mock;
}

テストを実行すると、フィルターで失敗します。取得しNSInvalidArgumentException - Reason: Return value does not match method signatureます。

NSPredicateで動作するように、スタブを設定する方法がわかりません。

誰か助けてもらえますか?

4

1 に答える 1

4

とても近い。スタブを設定する正しい方法は次のとおりです。

[[[mock stub] andReturn:OCMOCK_VALUE(status)] valueForKey:[OCMArg checkWithSelector:@selector(isEqualToString:) onObject:@"status"]];

スタブしようとしている属性はint型であり、そのためandReturnValue:を使用する必要があると予想されるため、これは最初は直感に反するように思えるかもしれません。

ただし、モック オブジェクトで呼び出される実際のメソッドはstatusではなくvalueForKey:であり、後者の戻り値の型はidです。そのため、 andReturnValue:を使用すると、スタブはプリミティブ値を返すように設定され、オブジェクトを提供するように求められると文句を言います。ちなみに、エラーメッセージはもっと明確かもしれません。それを調べます。

OCMOCK_VALUEマクロを使用して値オブジェクトを設定することはできますが、andReturn:を使用することで、スタブにラップされたプリミティブではなく、その値オブジェクトを返すように指示していることになり、それがvalueForKeyと互換性があります。戻り値の型。

于 2012-06-08T11:11:15.947 に答える