设置在嘲笑性质HttpContextBase(Setting properties on a moc

2019-09-22 03:19发布

我工作的ASP.NET MVC应用程序,并且想写对控制器的操作,其中一些操作上的HttpContext属性,如会议,Request.Cookies时,Response.Cookies,等我一些单元测试有一些麻烦搞清楚如何“安排,法,断言” ......我能看见安排并断言......但我无法搞清楚如何“动作”上的一个属性嘲笑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;
    }

Answer 1:

嘿,我觉得你只是经历有点脱节这里,没什么大不了的。 你描述的100%可能是。

我不是为什么你不能在你的嘲弄设置属性完全积极的,但如果你发布你的测试的完整代码,我很乐意去通过它你。 刚刚送走我的头顶,我会建议两件事情:

  1. 有()设置()和SetupProperty之间的差。 SetupProperty()可能是你,如果你想在性能跟踪值,而不是从他们只是得到一个值一次之后在做什么。

  2. 或者尝试调用SetupAllProperties()上的任何模拟,你需要设置的属性。

检查起订量快速启动以及一些例子。



Answer 2:

不知道是否有人有兴趣,但我一直在使用犀牛制品(我选择的武器)翻译起订量FakeHttpContext一个。

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; });


文章来源: Setting properties on a mocked HttpContextBase