我一直在使用在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);
這防止了空異常。不確定長期是否是一個好的答案,但它現在可行。
MVC Contrib項目使用RhinoMocks,而不是Moq。我可以用單元測試來使用Rhino,但Rhino不是我們的辦公室已經標準化的東西。 – 2009-02-12 19:35:32