单元测试我的控制器方法会导致一个空的 ViewName? [英] Unit testing my controller method results in an empty ViewName?

查看:16
本文介绍了单元测试我的控制器方法会导致一个空的 ViewName?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在用我的标准做一些简单的 MS 单元测试,没有什么特别的控制器.

I'm doing some simple MS unit tests on my standard, nothing special controller.

当我检查 ViewName 属性时,从返回的 ViewResult 对象中,它是 ""(空).

When I check the ViewName proprty, from the returned ViewResult object, it's "" (empty).

我的印象是 ViewName 是由 View 的名称暗示的(如 由这篇关于 ASP.NET MVC 控制器测试的 MS 文章建议).

I'm under the impression that the ViewName is implied by the name of the View (as suggested by this MS article on ASP.NET MVC controller testing).

顺便说一句,当我测试 ViewData 时,一切都在那里并且是正确的.

BTW, when I test the ViewData, it's all there and correct.

这是我的代码...

public ActionResult Index(int? page, string tag)
{
    if (page == null || page <= 0)
    {
        page = 1;
    }

    var viewData = new IndexViewData
                       {
                       ... my property setters, etc ...
                       };
    return View(viewData);
}

[TestMethod]
public void Index_Action_Should_Return_Index_View_For_Default_HomePage()
{
    // Arrange.
    var controller = PostController; // Wrapper, cause I use D.I.

    // Act.
    ViewResult viewResult = controller.Index(null, null) as ViewResult;

    // Assert.
    Assert.IsNotNull(viewResult);
    Assert.AreEqual("Index", viewResult.ViewName); // This is false/fails.

    var indexViewData = viewResult.ViewData.Model as IndexViewData;
    Assert.IsNotNull(indexViewData); // This is true.
}

推荐答案

ViewName 只有在您在 ViewResult 中设置时才会出现.如果您的视图名称与您的控制器名称匹配,那么我将检查以确保 ViewName 为空或空,因为这将是 (IMO) 正确的行为,因为您不想在视图上设置名称.我只在我打算返回的视图与操作不匹配时检查是否设置了 ViewName - 例如,当返回错误"视图时.

The ViewName is only present when you set it in the ViewResult. If your View name matches your controller name, then I would check to ensure that the ViewName is null or empty as that would be (IMO) the correct behavior since you wouldn't want to set a name on the view. I only check that the ViewName is set when I intend that the View to be returned does not match the action -- say, when returning the "Error" view, for example.

编辑:以下是 ViewResultBase.cs 中 ExecuteResult 的来源(来自 RC1,我的 Macintosh 上没有 RTW 的来源).如您所见,它会检查 ViewName 是否已直接设置,如果没有,则从控制器上下文的路由数据中的操作中提取它.这只发生在 ExecuteResult 中,它在控制器的操作完成后被调用.

EDIT: The following is the source for ExecuteResult in ViewResultBase.cs (from RC1, I don't have the source for RTW on my Macintosh). As you can see it checks to see if the ViewName has been set directly and if not, it pulls it from the action in the controller context's route data. This only happens in ExecuteResult, which is invoked AFTER your controller's action has completed.

    public override void ExecuteResult(ControllerContext context) {
        if (context == null) {
            throw new ArgumentNullException("context");
        }
        if (String.IsNullOrEmpty(ViewName)) {
            ViewName = context.RouteData.GetRequiredString("action");
        }

        ViewEngineResult result = null;

        if (View == null) {
            result = FindView(context);
            View = result.View;
        }

        ViewContext viewContext = new ViewContext(context, View, ViewData, TempData);
        View.Render(viewContext, context.HttpContext.Response.Output);

        if (result != null) {
            result.ViewEngine.ReleaseView(context, View);
        }
    }

这篇关于单元测试我的控制器方法会导致一个空的 ViewName?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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