MVC 3单元测试 - 获取实际响应数据 [英] MVC 3 Unit Test - Get Actual Response Data

查看:100
本文介绍了MVC 3单元测试 - 获取实际响应数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

所有,

我开发和单元测试使用ASP.NET MVC 3的控制器返回包含的VoiceXML浏览交互式语音应用程序。我想创建单元测试,捕捉实际的VoiceXML输出​​,所以我可以有模式验证它。

I'm developing and unit testing an interactive voice application using ASP.NET MVC 3 whose controllers return Views containing VoiceXML. I'd like to create unit tests that capture the actual VoiceXML output so I can schema-validate it.

我的阅读和测试已经采取我使用起订量斯科特轰的FakeHttpContext,还有这里的几个反应。一切编译正确,我试图做类似如下:

My reading and testing have taken me to Scott H's FakeHttpContext that uses Moq, as well as several responses here. Everything compiles correctly, and I'm trying to do something like the following:

[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
}

不过,通过这次加强,我可以看到欢迎视图被调用,但我正在寻找在Response.Output东西,并没有找到任何东西。模拟设置如下,希望CallBase设置为true,实际上写的东西出来。我发现了一些code,我加入到FakeHttpContext构造理应调用StringWriter的,但无济于事:

However, stepping through this, I can see that the Welcome view being called, but I'm looking for something in the Response.Output and not finding anything. The mock is set up as follows, in hope that setting CallBase to true would actually write something out. I found some code that I added to the FakeHttpContext constructor that supposedly invokes a StringWriter, but to no avail:

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;
}

我敢肯定,我缺少明显的东西,但现在我很为难。

I'm sure I'm missing something obvious, but I'm stumped right now.

感谢

吉姆士丹利

黑板连接

推荐答案

结果没有得到填充在的ViewResult。换句话说,该视图不是你调用你的控制器返回查看()渲染,而MVC取的ViewResult,并在请求 - 使得它在以后的时间sycle。你需要做的是创造一个ViewResults渲染功能,像这样的:

The result doesn't get populated in the ViewResult. In other words, the view isn't rendered by you calling return View() in your controller, rather mvc takes the viewresult and renders it at a later time in the request-sycle. What you need to do is to create a render-function for ViewResults, like this one:

using System;
using System.IO;
using System.Web.Mvc;

namespace CoPrice.Helpers
{
    public static class ViewRendrer
    {
        public static string ToHtml(this ViewResult result, Controller controller)
        {
            controller.ViewData.Model = result.Model;
            try
            {
                using (StringWriter sw = new StringWriter())
                {
                    ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(controller.ControllerContext, result.ViewName);
                    ViewContext context = new ViewContext(controller.ControllerContext, viewResult.View, result.ViewData, result.TempData, sw);
                    viewResult.View.Render(context, sw);

                    return sw.GetStringBuilder().ToString();
                }
            }
            catch (Exception e)
            {
                return e.ToString();
            }
        }
    }
}

然后,你可以做result.ToHtml(控制器)来获得实际的数据(这适用于只RazorViews我想,虽然我不知道,这就是我已经使用了至少)。

Then you can do result.ToHtml(controller) to get the actual data (this works for RazorViews only I think, though I'm not sure, that's what I've used it for at least).

这篇关于MVC 3单元测试 - 获取实际响应数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆