1

インデクサーに渡された値を見つける必要があります。

テストする必要があるコード (c#) は次のとおりです。

string cacheKey = GetCacheKey(cacheKeyRequest);
string cachedValue = myCache[cacheKey] as string;

したがって、インデクサーに渡された「cacheKey」の値を識別できる必要があります。

キャッシュ オブジェクトのモックを使用してこれを試みました。

var cache = MockRepository.GenerateMock<WebDataCache>();

コードが実行された後、モックにクエリを実行して、インデクサーに渡された値を特定するという考えです。

var actualCacheKey = cache.GetArgumentsForCallsMadeOn(a => a["somevalue"], opt => opt.IgnoreArguments())[0][0].ToString();

これにより、コンパイル エラーが発生します。ステートメントとして使用できるのは、代入、呼び出し、インクリメント、デクリメント、および新しいオブジェクト式のみです。

これを次の方法で関数にするという1つの提案を見ました。

var actualCacheKey = cache.GetArgumentsForCallsMadeOn(a => a["somevalue"] = null, opt => opt.IgnoreArguments())[0][0].ToString(); 

これはコンパイルされるようになりましたが、実行時に InvalidOperationException がスローされます: 確認する必要がありません。アクションのメソッド呼び出しが仮想 (C#) / オーバーライド可能な (VB.Net) メソッド呼び出しであることを確認してください。

助言がありますか?[RhinoMocks.3.6.1 を使用しています]

よろしくお願いします

グリフ

追伸 - 以前http://groups.google.com/group/rhinomocksに投稿しましたが、数日経っても閲覧数は憂鬱なほど低いままです。

4

1 に答える 1

3

例外は、何が起こっているかを正確に示しています。

InvalidOperationException: 検証する必要がありませんでした。アクションのメソッド呼び出しが仮想 (C#) / オーバーライド可能な (VB.Net) メソッド呼び出しであること確認てください。

つまり、Rhino が適切に機能するために (または、Castle が機能するプロキシを生成するために)、インデクサーは仮想である必要があります。それができない場合、Rhino はこの状況では役に立ちません。

インデクサーを仮想化したら、それは簡単なタスクです。

var cache = MockRepository.GenerateMock<WebDataChache>();
cache.Expect(c => c["SomeKey"]).Returns("SomeValue");

// perform actual test

cache.VerifyAllExpectations();

これにより、 でキャッシュにアクセスできるようになり["SomeKey"]ます。キーの値が異なる場合、テストはVerifyAllExpectations行で失敗します。

于 2012-06-15T09:37:45.167 に答える