2009-02-12 78 views
6

我一直在使用在Hanselman's blog找到的MvcMockHelpers类来传递一个模拟HttpContext。我们在某种程度上扩展了它,以添加我们需要的一些认证数据,而且大部分情况都非常好。嘲笑一个HttpContext Response.Output与Moq

我们遇到的问题是我们给控制器的上下文在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); 
    } 
} 

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

说明:我正在寻找的解决方案需要在Moq而不是Rhino中完成。我在问题标题中提到了Moq,但忽略了这个问题。对不起,有任何困惑。

分辨率 我添加的代码下面的两行到FakeHttpContext()方法:

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

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

回答

3

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

+0

MVC Contrib项目使用RhinoMocks,而不是Moq。我可以用单元测试来使用Rhino,但Rhino不是我们的办公室已经标准化的东西。 – 2009-02-12 19:35:32