4

HttpContext の User プロパティをモックしたい。Scott Hanselmans MVCHelper クラスと RhinoMocks を使用しています。

次のようなコードを含む単体テストがあります。

...

MockIdentity fakeId = new MockIdentity("TEST_USER", "Windows", true);
MockPrincipal fakeUser = new MockPrincipal(null, fakeId);

using (mocks.Record())
{
    Expect.Call(fakeHttpContext.User).Return(fakeUser);
}

...

私の MockIdentity および MockPrincipal クラスは、それぞれ IIdentity および IPrincipal に準拠するモックです。

単体テストを実行すると、次のようなエラーが表示されます。

System.NotImplementedException : メソッドまたは操作が実装されていません。System.Web.HttpContextBase.get_User() で

これは、ユーザー プロパティの期待値を設定しようとしているときに発生しています。

httpContextBase には実装されていないゲッターとセッターがあることは理解していますが、Rhino はモック時にこれを処理すると思いました。

これは、HttpContextbase から派生させて、モック オブジェクトのプロパティをオーバーライドする必要があるということですか。奇妙に思えます。

他のユーザーにもこの問題があり、ここで報告されています: http://www.mail-archive.com/rhinomocks@googlegroups.com/msg00546.html

4

3 に答える 3

8

ユーザー プロパティをモックするには、次のようにします。

var httpContext = MockRepository.GenerateStub<HttpContextBase>();
httpContext.Stub(x=>x.User).Return(yourFakePrincipalHere);

var controllerContext = new ControllerContext(httpContext, ....);

var controller = new HomeController();
controller.ControllerContext = controllerContext;

(これは、新しい RM 3.5 API を使用します。記録/再生を使用している場合は、次のようになります。

using(mocks.Record)
{
   _httpContext = _mocks.DynamicMock<HttpContextBase>();
   SetupResult.For(_httpContext.User).Return(...);
}

using(mocks.PlayBack())
{
   ....
}
于 2009-03-24T16:31:01.340 に答える
3

[免責事項: Typemock で働いています]

あなたが尋ねたものではないことはわかっていますが、上記の回答を見て、必要なことを行う別の方法を示す必要があります- Isolatorを使用します。

var fakeId = Isolate.Fake.Instance<IIdentity>();
Isolate.WhenCalled(() => fakeId.AuthenticationType).WillReturn("Windows");
Isolate.WhenCalled(() => fakeId.Name).WillReturn("TEST_USER");
Isolate.WhenCalled(() => fakeId.IsAuthenticated).WillReturn(true);

var fakePrincipal = Isolate.Fake.Instance<IPrincipal>();
Isolate.WhenCalled(() => fakePrincipal.Identity).WillReturn(fakeId);

var fakeContext = Isolate.Fake.Instance<HttpContext>();
Isolate.WhenCalled(() => fakeContext.User).WillReturn(fakePrincipal);
于 2010-02-17T10:28:19.577 に答える