2009-02-12 81 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