0

短縮版:

Rhino Mocksに呼び出しをシミュレートして、HttpContext.Cache["MyKey"]期待されるデータを返すようにするにはどうすればよいですか?

ロングバージョン:

HttpContext.CacheRhinoMocksを使用してからの戻り値をシミュレートする必要があります。TestInitialize(Visual Studio)単体テストのメソッドで次のコードを使用しています

// All these are fields on my Unit test class.
foo = new Foo();
mock = new MockRepository();
context = mocks.DynamickMock<HttpContextBase>();
var cache = context.Stub(x => x.Cache).Return(HttpRuntime.Cache);

ここまでは順調ですね。今、私は次の2つを試しました。

cache.Stub(x => x["MyKey"]).Return(foo);

context.Stub(x => x.Cache["MyKey"]).Return(foo);

最初のものはコンパイルすらしません。Visual Studioによると、「 []を使用したインデックスを'Rhino.Mocks.Interfaces.IMethodOptions'型の式に適用することはできません」とのことです。

2つ目はコンパイルしますが、。を取得しNullReferenceExceptionます。まだ電話をかけていなかったからだと思いますmock.ReplayAll();。テスト内でこの行を移動しても(前または後mock.ReplayAll())、まだ。が表示されNullReferenceExceptionます。例外には内部例外はありません。ただし、Cacheのにカーソルを合わせるx.Cacheと、次のエラーメッセージが次の値として表示されますx.Cache。 " 'x.Cache'はタイプSystem.InvalidOperationException"の例外をスローし、その例外のメッセージは "* Previous method'HttpContextBase.get_Cache() ; ' スローするには戻り値または例外が必要です。*"。

mock.ReplayAll()さて、呼び出されていない限り、なぜそれが起こるのかは理解できたと思いますが、その後になぜ起こるのかはわかりません。

つまり、どうすればこれを機能させることができますか?Rhino Mocksに呼び出しをシミュレートして、HttpContext.Cache["MyKey"]期待されるデータを返すようにするにはどうすればよいですか?

4

1 に答える 1

0

わかりました、実際にはそれをスタブする必要はありません。呼び出した後、mocks.ReplayAll()使用してキャッシュに必要なものを挿入する必要があります

_context.Cache.Insert("MyKey", foo);

唯一の欠点は、テストの初期化メソッドでこれを使用する方法がないように見えることです。

于 2013-03-07T08:50:47.347 に答える