Asp.net mvc 确保视图存在

Asp.net mvc 确保视图存在,asp.net-mvc,unit-testing,Asp.net Mvc,Unit Testing,我目前正在为我必须创建的新应用程序进行单元测试。我的基本测试进行得很顺利(测试ActionResult类非常好)。不过,我确实想确保的一件事是,我的解决方案中存在一个viewpage。我不是100%确定我的测试是正确的,所以如果有人有建议,请不要犹豫 这是一个测试,我必须检查我在安全控制器上的登录方法是否正确: [TestMethod] public void Login() { var authProvider = new Mock<IAuthenticationProvider

我目前正在为我必须创建的新应用程序进行单元测试。我的基本测试进行得很顺利(测试ActionResult类非常好)。不过,我确实想确保的一件事是,我的解决方案中存在一个viewpage。我不是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.");
}
[TestMethod]
公共无效登录()
{
var authProvider=new Mock();
var控制器=新的SecurityController(authProvider.Object);
var result=controller.Login()作为ViewResult;
IsNotNull(结果,“ActionResult应为ViewResult类型”);
Assert.AreEqual(result.ViewName,“login”,“不呈现登录页面”);
}
我对测试的解释是:

  • 在控制器上调用“Login”方法
  • 确认它正在渲染视图(通过检查它是否返回ViewResult对象)
  • 确认它正在渲染正确的视图(通过检查viewname)
我想要的是第三个断言,看看要呈现的视图是否确实存在

我的一些次要问题是:

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



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

如果您使用的是beta版,您的代码隐藏文件将为视图创建一个类,您可以检查是否使用了反射

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

  • 不,我认为你不应该把测试分割开来,只要它主要是第三个断言,而不是更多的代码

  • 是的,我想一个更具描述性的名字会有帮助

  • 既然您已经验证了它具有正确的视图名称,那么简单地成功地呈现视图不就是验证它的存在吗


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

我完全同意Jason的观点,但我不认为您所做的实际上有助于提高测试覆盖率。毕竟,呈现它和测试行为已经涵盖了它是否存在


许多开发人员在第一次被测试驱动的开发错误所困扰时就已经过火了。他们希望测试失败能够准确地告诉他们出了什么问题,这样他们就不必深入研究和调试。这不是测试的主要目的;测试是为了验证正确的行为,这样您就不会发布坏的软件。当出现问题时,您可以进行调试。没有必要让测试线束如此具体,以至于测试引擎能够准确地知道问题所在。

知道解决方案中存在视图并不是非常有用。您真正关心的是视图将被部署,因为您的用户(我希望)不会在VisualStudio中运行您的站点。换句话说,您要求的不是单元测试,而是集成测试。因此,您应该为该作业使用适当的工具。考虑一个Web测试框架,比如.< /p> ,您可以尝试使用View结果中的ViefEngEnEngulink对象的FixView方法来检查MVC框架是否可以定位视图。 正如其他人所建议的那样,我认为第三个断言(视图实际存在)不会为您的测试增加真正的价值,但是,下面是检查存在性的代码:

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

希望这能有所帮助。

我特别希望避免直接检查文件系统。我曾想过,但这样做感觉不对。我想验证一个视图是否存在的原因是,我已经遇到了一种情况,我的应用程序可以正常测试,但我忘记添加视图(即使它可能是默认视图)。当我可以通过测试捕获错误时,我想防止我的应用程序抛出错误。好的。您是否可以尝试渲染视图,检查输出的一些基本功能,如果在前两次断言后失败,则您知道该视图不存在?您还应该检查viewEngineResult.Viewwhy可以将my result.ViewName设置为空?-不能让它工作