【问题标题】:Mocking a HttpContext Response.Output with Moq使用 Moq 模拟 HttpContext Response.Output
【发布时间】:2009-02-12 16:25:46
【问题描述】:

我一直在使用位于 Hanselman's blog 的 MvcMockHelpers 类来传递模拟的 HttpContext。我们对其进行了一些扩展,以添加一些我们需要的身份验证数据,而且在大多数情况下这都很棒。

我们遇到的问题是,我们提供给控制器的上下文在 HttpContext.Response.Output 中有一个空值,这会导致一些异常被抛出。我不确定要添加什么才能使其正常工作。

这是现有的 FakeHttpConext() 方法:

public static HttpContextBase FakeHttpContext()
{
    var context = new Mock<HttpContextBase>();
    var request = new Mock<HttpRequestBase>();
    var response = new Mock<HttpResponseBase>();
    var session = new Mock<HttpSessionStateBase>();
    var server = new Mock<HttpServerUtilityBase>();

    // Our identity additions ...
    var user = new Mock<IPrincipal>();
    OurIdentity identity = (OurIdentity)Thread.CurrentPrincipal.Identity;

    context.Expect(ctx => ctx.Request).Returns(request.Object);
    context.Expect(ctx => ctx.Response).Returns(response.Object);
    context.Expect(ctx => ctx.Session).Returns(session.Object);
    context.Expect(ctx => ctx.Server).Returns(server.Object);
    context.Expect(ctx => ctx.User).Returns(user.Object);
    context.Expect(ctx => ctx.User.Identity).Returns(identity);
    return context.Object;
}

这里是爆炸方法(它是 MVC Contrib 项目的 XmlResult 的一部分):

public override void ExecuteResult(ControllerContext context)
{
    if (_objectToSerialize != null)
    {
       var xs = new XmlSerializer(_objectToSerialize.GetType());
       context.HttpContext.Response.ContentType = "text/xml";
       xs.Serialize(context.HttpContext.Response.Output, _objectToSerialize);
    }
}

在引用context.HttpContext.Response.Output时需要在FakeHttpContext方法中添加什么来防止出现null异常?

澄清:我正在寻找的解决方案需要在 Moq 中完成,而不是 Rhino。我在问题标题中提到了 Moq,但忽略了问题正文。如有任何混淆,请见谅。

分辨率 我在 FakeHttpContext() 方法中添加了以下两行代码:

var writer = new StringWriter();
context.Expect(ctx => ctx.Response.Output).Returns(writer);

这可以防止空异常。不确定它是否是一个长期的好答案,但它现在有效。

【问题讨论】:

    标签: c# asp.net-mvc mocking moq httpcontext


    【解决方案1】:

    在MvcContrib 的测试中,文件 MvcMockHelps 显示了它是如何完成的。

    【讨论】:

    • MVC Contrib 项目使用 RhinoMocks,而不是 Moq。我可以使用 Rhino 进行单元测试,但 Rhino 不是我们办公室标准化的。
    • 你需要做的是调用 mockedRequest.Output 返回一个 TextWriter 并且 mockedRequest.OutputStream 返回一个流,例如 MemoryStream。
    • 是的...这是我不知道该怎么做的部分。仍在尝试不同的事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-29
    • 1970-01-01
    • 2013-06-13
    • 2011-06-13
    • 2019-09-11
    • 2010-11-16
    • 1970-01-01
    相关资源
    最近更新 更多