【发布时间】:2011-05-12 18:30:48
【问题描述】:
全部,
我正在使用 ASP.NET MVC 3 开发和单元测试一个交互式语音应用程序,其控制器返回包含 VoiceXML 的视图。我想创建捕获实际 VoiceXML 输出的单元测试,以便对其进行架构验证。
我的阅读和测试将我带到了 Scott H 的使用 Moq 的 FakeHttpContext,以及这里的几个回复。一切都正确编译,我正在尝试执行以下操作:
[TestMethod]
public void WelcomeTest1()
{
EmergencyController controller = new EmergencyController();
controller.ControllerContext = new ControllerContext(MvcMockHelpers.FakeHttpContext("~/Emergency/Welcome"), new RouteData(), controller);
ViewResult result = (controller.Welcome()) as ViewResult;
.
.
Assert.IsTrue(controller.ControllerContext.HttpContext.Response.OutputStream.Length > 0);
// assert schema validation on the output here
}
但是,逐步执行此操作,我可以看到正在调用 Welcome 视图,但我正在 Response.Output 中查找某些内容,但没有找到任何内容。模拟设置如下,希望将 CallBase 设置为 true 会真正写出一些东西。我发现了一些我添加到 FakeHttpContext 构造函数中的代码,据说它调用了 StringWriter,但无济于事:
public static HttpContextBase FakeHttpContext()
{
var context = new Mock<HttpContextBase>();
var request = new Mock<HttpRequestBase>() { CallBase = true };
var response = new Mock<HttpResponseBase>();
var session = new Mock<HttpSessionStateBase>();
var server = new Mock<HttpServerUtilityBase>();
context.Setup(ctx => ctx.Request).Returns(request.Object);
context.Setup(ctx => ctx.Response).Returns(response.Object);
context.Setup(ctx => ctx.Session).Returns(session.Object);
context.Setup(ctx => ctx.Server).Returns(server.Object);
response.Setup(r => r.OutputStream).Returns(new MemoryStream());
response.Setup(r => r.Headers).Returns(new NameValueCollection());
var writer = new StringWriter();
var wr = new SimpleWorkerRequest("", "", "", "", writer);
HttpContext.Current = new HttpContext(wr);
return context.Object;
}
我确定我遗漏了一些明显的东西,但我现在很难过。
谢谢
吉姆·斯坦利
黑板连接
【问题讨论】:
标签: unit-testing asp.net-mvc-3 moq