私はモッキング フレームワークを初めて使用し、RhinoMocks を使用して MVC アプリ ユニット テストを支援し始めました。
Scott Hanselmann の MVC Mock Helperを使用して、HttpContext のモックを作成しています。私は(しばらくしてから)必要なもののいくつかをうまくモックしましたが、HttpContextのApplicationプロパティに関しては行き詰まりました。
私のアプリケーションでは、オブジェクトをアプリケーションに保存し、次のようにコントローラー内で取得します。
SomeObj foo = (SomeObj)Application["fooKey"];
これは、MVC アプリの Application_Start で作成されます。
UPDATED FOLLOWING FOLLOWING FIRST ANSWER (明確にするための追加コード) 現在、テストセットアップで次のことを行っています。
HttpContextBase mockHttpBase = mocks.FakeHttpContext();
controllerToTest = new SomeController();
mocks.SetFakeControllerContext(controllerToTest);
HttpApplicationStateBase appState =
MockRepository.GenerateStub<HttpApplicationStateBase>();
Globals tmpAppGlobals =
new Globals();
mockHttpBase.Expect(ctx => ctx.Application).Return(appState);
mockHttpBase.Expect(ctx => ctx.Application[Globals.GlobalsKey]).
Return(tmpAppGlobals);
私の単体テストのセットアップでは、次のことを行います。
Globals tmpAppGlobals = new Globals();
controllerToTest.ControllerContext.HttpContext.
Expect(ctx => ctx.Application[Globals.GlobalsKey]).
Return(tmpAppGlobals);
この呼び出しは、Application オブジェクトに対して NullReference 例外をスローします。
私の質問は 2 つあります。
1)これは正しいアプローチですか、それとも設計/アーキテクチャの観点から何か間違ったことをしましたか?
2) なぜこれが機能しないのですか?!
前もって感謝します。