单元测试asp mvc视图

时间:2010-02-22 22:22:19

标签: c# asp.net asp.net-mvc unit-testing

如何对ASP MVC应用程序的视图进行单元测试?

我已经尝试过mvc contrib test helper ...

 _controller.Index().AssertViewRendered();

但这实际上并没有测试视图。

例如,我可以愉快地在视图中插入一些伪造的代码,并获得可怕的死亡黄色屏幕,而我的单元测试不知道它。

有没有任何确定的方法呢?我需要模拟视图引擎吗? mvccontrib是否迎合了这个?

我原本以为这是一个非常普遍的要求,但我找不到太多关于它的信息!

由于

修改 我真正追求的是编译时间检查,以确保模型更改不会影响视图。

这个问题包含了启用构建时间视图编译的说明,这对我来说已经足够了。 Compile Views in ASP.NET MVC

6 个答案:

答案 0 :(得分:13)

有3种选择:

  1. 您希望对视图中的代码进行单元测试。在这种情况下,您必须将代码移动到控制器,因为视图不负责获取此代码。
  2. 您希望确保视图实际显示在浏览器中。使用浏览器UI测试工具,如waitin或selenium。这不会创建视图的独立测试,而是创建应用程序的大部分。这听起来像是一个优势,但在视图的孤立测试中是否有任何价值?
  3. 您想测试视图中的代码是可编译的代码。然后编译代码。这可以在单元测试中完成,方法是手动调用view.compile或在构建过程中打开视图编译器。

答案 1 :(得分:3)

可以使用Visual Studio测试工具通过单元测试测试您的视图,但只能控制器创建的值(例如ViewBag中的值:ViewBag.message = "My message.")或渲染视图的名称:

[TestMethod]
public void MyActionTest()
{
    // Arrange
    var lController = new HomeController();

    // Act
    var lResult = lController.MyAction() as ViewResult;

    // Assert
    Assert.IsTrue(lResult.ViewBag.message == "My message.", "Wrong Message in Viewbag.");
    Assert.IsTrue(lResult.ViewName == "MyView", "Incorrect view.");
}

如果您想自动测试包含HTML的整个视图,我建议Selenium IDE作为快速简单的解决方案,Selenium Web Driver用于跨浏览器测试和专家。

答案 2 :(得分:2)

如果您需要自动化测试,您应该查看MS测试套件中的Web测试工具或其他一些Web测试工具(如Selenium)来测试视图。我认为你会发现它比调整单元测试框架更容易。

完全披露:我仍然手工测试我的UI。我没有找到足够的好处来超过学习,设置和维护网络测试的成本。

答案 3 :(得分:2)

单元测试通常不会测试用户界面,因为它只是太脆弱

虽然您可能会认为最小测试是在我们尝试渲染时,View不会因异常而崩溃,但这也是我们实际可以为View编写的唯一单元测试(ASP.NET MVC,WPF,Windows Forms等 - 它并不重要。)

您(或您的客户)要测试的下一件事是View正确呈现,并且您无法通过自动化测试可靠地执行此操作。这一切归结为视图更好地通过目视检查进行测试,因为投资回报就好比尝试开发和维护自动化UI测试更好。 / p>

答案 4 :(得分:0)

我的建议是不要费心去广泛测试你的观点。这很难,而且如果你做得对,无论如何都不会有太多的逻辑。

那就是说,WatiN是自动浏览器测试的好工具 - 不完全是你想要的,但效果很好。

答案 5 :(得分:0)

在ASP.NET MVC页面中测试视图相当容易。

I walk you through step-by-step in a YouTube video。以下是所需步骤的概述:

  1. 您需要在控制器中创建单元测试。这允许轻松调用渲染结果。例如:

    public ActionResult TestScenario()
    {
         // setup some models
         return View("Page", model);
    }
    
  2. 您的单元测试需要调用该ControllerAction,并验证结果。 在ApprovalTests中,这将是:

    MvcApprovals.VerifyMvcPage(new MyController().TestScenario);
    

    这在ApprovalTests(www.approvaltests.com或nuget)中非常简单。