单元测试Html.Action和PartialView

时间:2011-08-04 08:30:04

标签: asp.net-mvc unit-testing asp.net-mvc-3

我想测试一些控制器动作,这些动作的视图包含带有PartialViews的Html.Action。但是在调试它们时,我没有得到我想通过视图调用的动作中的断点 这是我的控制器代码:

public class SomeController
{ 
    public ActionResult MyAction()
    {
        return View();
    }

    public PartialViewResult SubAction()
    {
        return PartialView();
    }
}

MyAction视图中的代码只是:

@{
    ViewBag.Title = "MyAction";
}
@Html.Action("SubAction")

使用我的TestMethod,我想检查是否返回了正确的ViewName:

[TestMethod]
public void MyActionTest()
{
    SomeController controller = new SomeController();
    ViewResult result = controller.MyAction() as ViewResult;
    Assert.IsNotNull(result, "The result is not a view result.");
    Assert.AreEqual("some expected name", result.ViewName);
}

另一个问题是result.ViewName在这里是空的,我不知道为什么会这样。所以这是另一个没有答案的问题。这个问题是为什么我试图调试我的单元测试并且认识到我无法进入SubAction()。

有关于此的任何建议吗?

干杯,
西蒙

2 个答案:

答案 0 :(得分:2)

运行单元测试时,不会呈现视图。 @Html.Action("SubAction")仅在呈现视图时执行。当你说:“我想测试一些控制器动作,其视图包含带有PartialViews的Html.Action”时,你实际上是在说你要测试视图中的视图和逻辑。

未达到SubAction中断的原因是因为MyAction视图根本没有呈现。测试这些场景的方法是:

  1. 在测试1中检查MyAction是否返回其内部视图模型在其属性中具有所有正确值的ViewResult。
  2. 在单元测试中2检查SubAction是否返回其内部视图模型在其属性中具有所有正确值的ViewResult。
  3. ViewName是一个仅在您调用return View("some other non-convetional view")时填充的属性,然后result.ViewName将= "some other non-convetional view"您不测试使用约定默认值的视图名称,因为您信任正确连接它的框架。

答案 1 :(得分:2)

  1. ViewResult,更一般地说,ActionResult是将结果返回给客户端时要执行的内容的某种规范。换句话说,创建它的实例(从控制器返回View())会创建规范,但不会执行它。 MVC运行时捕获从控制器和Execute()s返回的ActionResult。您无法在视图内部进行分解,因为它尚未执行 - 只是创建了规范。如果您在其上调用Execute()方法,就像mvc运行时一样,您将触发视图执行并点击调试器。
  2. 您无法看到视图名称,因为您没有设置它。来自msdn
  3.   

    ViewResult.ViewName获取或设置要呈现的视图的名称。

    如果你在返回View时没有设置它,它只会在ViewResult为Executed()时填充,请参阅上面的解释。

    在单元测试控制器时,您应该只测试控制器及其与视图,存储库等的迭代。测试控制器时,您不需要调试视图。如果需要测试SubAction,请为其编写单独的测试。您可以使用MvcContrib.TestHelpers对控制器进行更简单的单元测试。