我想测试一些控制器动作,这些动作的视图包含带有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()。
有关于此的任何建议吗?
干杯,
西蒙
答案 0 :(得分:2)
运行单元测试时,不会呈现视图。 @Html.Action("SubAction")
仅在呈现视图时执行。当你说:“我想测试一些控制器动作,其视图包含带有PartialViews的Html.Action”时,你实际上是在说你要测试视图中的视图和逻辑。
未达到SubAction中断的原因是因为MyAction视图根本没有呈现。测试这些场景的方法是:
View("some other non-convetional view")
时填充的属性,然后result.ViewName
将= "some other non-convetional view"
您不测试使用约定默认值的视图名称,因为您信任正确连接它的框架。答案 1 :(得分:2)
ViewResult
,更一般地说,ActionResult
是将结果返回给客户端时要执行的内容的某种规范。换句话说,创建它的实例(从控制器返回View())会创建规范,但不会执行它。 MVC运行时捕获从控制器和Execute()s
返回的ActionResult。您无法在视图内部进行分解,因为它尚未执行 - 只是创建了规范。如果您在其上调用Execute()
方法,就像mvc运行时一样,您将触发视图执行并点击调试器。 ViewResult.ViewName获取或设置要呈现的视图的名称。
如果你在返回View时没有设置它,它只会在ViewResult为Executed()
时填充,请参阅上面的解释。
在单元测试控制器时,您应该只测试控制器及其与视图,存储库等的迭代。测试控制器时,您不需要调试视图。如果需要测试SubAction,请为其编写单独的测试。您可以使用MvcContrib.TestHelpers对控制器进行更简单的单元测试。