代码之家  ›  专栏  ›  技术社区  ›  Erik van Brakel scottrakes

确保视图存在

  •  7
  • Erik van Brakel scottrakes  · 技术社区  · 16 年前

    我目前正在为我必须创建的新应用程序进行单元测试。我的基本测试进展顺利(测试ActionResult类非常好)。不过,我确实想确保的一件事是,我的解决方案中存在一个视图页面。我不是100%确定我的测试是正确的,所以如果有人有建议,请不要犹豫!

    这是一个测试,我必须检查我的安全控制器上的登录方法是否正确:

    [TestMethod]
    public void Login()
    {
        var authProvider = new Mock<IAuthenticationProvider>();
        var controller = new SecurityController(authProvider.Object);
    
        var result = controller.Login() as ViewResult;
    
        Assert.IsNotNull(result, "ActionResult should be of type ViewResult.");
        Assert.AreEqual(result.ViewName, "login", "Does not render login page.");
    }
    

    我对测试的解释是:

    • 在控制器上调用“Login”方法
    • 确认它正在渲染视图(通过检查它是否返回ViewResult对象)
    • 确认它正在渲染正确的视图(通过检查视图名称)

    我想要的是第三个断言,看看要呈现的视图是否真的存在。

    我的一些次要问题是:

    • 我应该把这次考试分开吗?
    • 我应该重命名它吗(比如,呃,LoginRendersCorrectView或其他什么)

    谢谢!


    注意:我明确地试图避免检查文件系统。我希望有一种方法可以使用ViewEngine来确认视图确实存在。

    5 回复  |  直到 16 年前
        1
  •  9
  •   Jason Livesay    16 年前
    • 不,我认为你不应该把测试分开,只要它主要是第三个断言,而不是更多的代码。

    • 是的,我认为一个更具描述性的名字会有所帮助。

    • 既然您已经验证了它具有正确的视图名称,那么简单地渲染视图就不能验证它的存在吗?

    我认为你正在研究完整的测试覆盖率,这很好,但在这里,我觉得如果你能够继续进行验证执行实际特定登录功能的单元(如验证密码哈希或其他)是否正常工作的部分,你的时间可能会得到更有效的利用。

        2
  •  5
  •   Craig Stuntz    16 年前

    知道解决方案中存在该视图并不是非常有用。你真正关心的是视图将被部署,因为你的用户(我希望)不会在Visual Studio中运行你的网站。换句话说,你要求的不是单元测试,而是集成测试。因此,你应该为这项工作使用合适的工具。考虑一个web测试框架,如 Selenium .

        3
  •  4
  •   jwheron    12 年前

    我完全同意Jason的观点,但我不认为你试图做的事情实际上有助于测试覆盖率。毕竟,渲染它和测试行为已经涵盖了它是否存在。

    许多开发人员在第一次被测试驱动的开发bug咬伤时就走极端了。他们希望测试失败能够准确地告诉他们出了什么问题,这样他们就不必深入挖掘和调试了。这不是测试的主要目的;测试是为了验证正确的行为,这样你就不会发布糟糕的软件。当出现问题时,您可以进行调试。不需要有一个测试线束如此具体,以至于测试引擎确切地知道问题是什么。

        4
  •  1
  •   Florin Sabau    16 年前

    您可以尝试使用ViewResult中ViewEngineCollection对象的FindView方法来检查MVC框架是否可以定位视图。

    正如其他人所建议的那样,我认为这个3'rd断言(即视图确实存在)不会为你的测试增加真正的价值,但尽管如此,以下是检查是否存在的代码:

    var viewEngineResult = result.ViewEngineCollection.FindView(controller, result.ViewName, result.MasterName);
    if (viewEngineResult == null)
        ... not found ...
    

    希望这能有所帮助。

        5
  •  0
  •   ajma    16 年前

    如果您使用的是测试版,您的代码隐藏文件将为View创建一个类,您可以使用反射检查该类。

    否则,您可以检查文件是否存在于正确的位置。