单元测试我的控制器方法导致一个空的ViewName?

Pur*_*ome 27 asp.net-mvc unit-testing controller

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

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

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

顺便说一句,当我测试ViewData时,它就在那里并且正确.

这是我的代码......

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.
}
Run Code Online (Sandbox Code Playgroud)

tva*_*son 28

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

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

    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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

  • 不.我的意思是,为了选择视图,它会检查ViewResult中的ViewName是空还是空,如果是,则选择与该操作同名的视图.除非您在ViewResult中专门设置ViewName,否则ViewName将为null.我将从源代码发布相关代码 (2认同)
  • AHHHHHHHHHHHHHH !!!! 我现在得了:)所以如果我确实返回了View("Index",viewdata),那么将设​​置viewname!因为(在我的原始示例中)我刚刚返回了viewdata,它通过方法的名称找出了视图!啊!疑难杂症!:) (2认同)