为什么不指定视图名称导致我的单元测试失败?

时间:2009-11-18 02:00:01

标签: c# .net asp.net-mvc asp.net-mvc-2

在我的单元测试中,我发现当我使用没有视图名称的View()从控制器操作返回时,ViewResult.ViewName被设置为string.Empty。为了设置它,必须将其指定为View()调用的参数。例如,给出以下单元测试:

[TextFixture]
public class MyControllerTests 
{
    [Test]
    public void TestMyAction() 
    {
        var controller = new MyController();
        var result = controller.MyAction();

        Assert.AreEqual("MyAction", result.ViewName);
    }
}

以下操作实现将导致单元测试失败:

public class MyController : Controller 
{
    public ActionResult MyAction() 
    {
        return View();
    }
}

虽然这个会通过:

public class MyController : Controller 
{
    public ActionResult MyAction() 
    {
        return View("MyAction");
    }
}

我在.NET 4.0上使用ASP.NET MVC 2(pre-beta)。但是,我没有使用任何特定于.NET 4.0的东西。我发现这种行为很奇怪,因为我认为ViewName是可以在单元测试的断言中检查的可靠属性之一。

1 个答案:

答案 0 :(得分:3)

这是ASP.NET MVC的一个众所周知的“功能”。自第一个版本以来,Microsoft已经记录了它......

如果未指定显式视图名称,框架将尝试根据约定(在“Views \ controllername \ actionname”或“Shared \ controllername \ actionname”中)找到一个。 ViewName仅在您想要偏离该约定时才有意义。因此,您的单元测试会做出错误的假设。

HTH。