如何测试ASP.Net MVC视图?

4

我希望编写一个单元测试,以确保我返回的视图是正确的。

我的计划是编写一个测试,首先调用控制器,然后调用我打算测试的ActionResult方法。 我想我可以编写类似以下的内容:

Controller controller = new HomeController();
var actionresult = controller.Index();
Assert.False(actionresult.ToString(), String.Empty);

这将允许我解析Action结果以获取测试值。 但是,我无法直接实例化public ActionResult Index()方法。

我该怎么做?


然而,我无法直接实例化公共的ActionResult Index()方法。你能解释一下为什么吗? - J.W.
你说的“无法直接实例化该方法”是什么意思? - Garry Shutler
我的意思是我输入了“controller”。但是Index不会出现作为我可以实例化的方法之一。 - Nissan
你的代码能编译通过吗? - J.W.
2个回答

4
在这里,MVCContrib中的测试帮助程序将对您有所帮助。
ViewResult result = controller.Index().AssertViewRendered().ForView("Blah");

1
这是来自《专业ASP.NET MVC 1.0》(书籍)的示例:

[TestMethod]
public void AboutReturnsAboutView()
{
     HomeController controller = new HomeController();
     ViewResult result = controller.About() as ViewResult;

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

请注意,如果您的控制器方法中没有返回显式视图,即这样做,它将失败:

     Return(View("About"));

不要翻译这个:


     Return(View());

否则测试将无法通过。如果您的方法将返回多个视图,则只需要执行此操作,否则应该返回隐式视图并不必测试框架。


1
测试您的代码,应为ViewResult result = controller.About() as ViewResult;没有“s”,但到目前为止看起来不错。如果我完成后它能够正常工作,我会将此答案选为正确答案。 - Nissan
对不起,那是一个打字错误。从实际的书中复制和粘贴很难 :) - Matthew Groves

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接