我一直在使用在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