3

私は ASP.NET MVC アプリケーションに取り組んでおり、コントローラー アクションに対していくつかの単体テストを作成しようとしています。そのうちのいくつかは、Session、Request.Cookies、Response.Cookies などの HttpContext のプロパティを操作します。 「アレンジ、アクト、アサート」の方法を理解するのに苦労しています...アレンジとアサートを見ることができます...しかし、モックされた HttpContextBase のプロパティですべてのプロパティを「アクト」する方法を理解するのに問題がありますゲッターしかありません。コントローラー アクション内からモック コンテキストに何も設定できないので、あまり役に立ちません。私は嘲笑にかなり慣れていないので、何かが欠けていると確信しています。プロパティ値、そして後でそれらがまだ私が設定したものであるか、またはそのようなものであることをアサートします。私は何が欠けていますか?

    public static HttpContextBase GetMockHttpContext()
    {
        var requestCookies = new Mock<HttpCookieCollection>();
        var request = new Mock<HttpRequestBase>();
        request.Setup(r => r.Cookies).Returns(requestCookies.Object);
        request.Setup(r => r.Url).Returns(new Uri("http://example.org"));

        var responseCookies = new Mock<HttpCookieCollection>();
        var response = new Mock<HttpResponseBase>();
        response.Setup(r => r.Cookies).Returns(responseCookies.Object);

        var context = new Mock<HttpContextBase>();

        context.Setup(ctx => ctx.Request).Returns(request.Object);
        context.Setup(ctx => ctx.Response).Returns(response.Object);
        context.Setup(ctx => ctx.Session).Returns(new Mock<HttpSessionStateBase>().Object);
        context.Setup(ctx => ctx.Server).Returns(new Mock<HttpServerUtilityBase>().Object);
        context.Setup(ctx => ctx.User).Returns(GetMockMembershipUser());
        context.Setup(ctx => ctx.User.Identity).Returns(context.Object.User.Identity);
        context.Setup(ctx => ctx.Response.Output).Returns(new StringWriter());

        return context.Object;
    }
4

2 に答える 2

4

誰かが興味を持っているかどうかはわかりませんが、Moq FakeHttpContext を Rhino Mocks (私の選択した武器) を使用するものに変換しました。

public static HttpContextBase FakeHttpContext()
        {
            var httpContext = MockRepository.GenerateMock<HttpContextBase>();
            var request = MockRepository.GenerateMock<HttpRequestBase>();
            var response = MockRepository.GenerateMock<HttpResponseBase>();
            var session = MockRepository.GenerateMock<HttpSessionStateBase>();
            var server = MockRepository.GenerateMock<HttpServerUtilityBase>();
            var cookies = new HttpCookieCollection();
            response.Stub(r => r.Cookies).Return(cookies);
            request.Stub(r => r.Cookies).Return(cookies);
            request.Stub(r => r.Url).Return(new Uri("http://test.com"));

            httpContext.Stub(x => x.Server).Return(server);
            httpContext.Stub(x => x.Session).Return(session);
            httpContext.Stub(x => x.Request).Return(request);
            httpContext.Stub(x => x.Response).Return(response);
            var writer = new StringWriter();
            var wr = new SimpleWorkerRequest("", "", "", "", writer);
            System.Web.HttpContext.Current = new System.Web.HttpContext(wr);
            return httpContext;

        }

ユニットテストでの使用法

_httpContext = FakeHttpContext();
var cookieManager = new CookieManager(_httpContext);
string username = cookieManager.GetUsername();
_httpContext.AssertWasCalled(hc => { var dummy = hc.Request; });
于 2010-04-06T22:14:25.217 に答える
2

ちょっと、ここでちょっとした断絶を経験しているだけだと思いますが、大したことではありません。あなたが説明することは100%可能です。

モックにプロパティを設定できない理由については完全に肯定的ではありませんが、テストの完全なコードを投稿していただければ、喜んで一緒に試してみたいと思います。頭のてっぺんから、次の2つのことを提案します。

  1. Setup() と SetupProperty() には違いがあります。一度プロパティから値を取得するのではなく、プロパティの値を追跡したい場合は、おそらく SetupProperty() を使用することをお勧めします。

  2. または、プロパティを設定する必要があるモックで SetupAllProperties() を呼び出してみてください。

いくつかの例については、 Moq クイックスタートも確認してください。

于 2009-08-04T03:21:29.993 に答える