确保存在视图

时间:2009-01-30 00:40:56

标签: asp.net-mvc unit-testing

我目前正在研究我必须创建的新应用程序的单元测试。我已经完成了基本的测试(测试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.");
}

我对测试的解释是:

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

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

我的一些次要问题是:

  • 我应该分开这个测试吗?
  • 我应该重命名它(比如,错误,LoginRendersCorrectView或其他东西)

谢谢!


注意:我明确地试图避免检查文件系统。我有点希望能够使用ViewEngine确认视图实际存在。

5 个答案:

答案 0 :(得分:9)

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

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

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

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

答案 1 :(得分:5)

了解解决方案中存在的视图并不是非常有用。您真正关心的是视图将被部署,因为您的用户(我希望)不会在Visual Studio中运行您的站点。换句话说,您要求的不是单元测试,而是集成测试。因此,您应该使用适当的工具来完成工作。考虑像Selenium这样的Web测试框架。

答案 2 :(得分:4)

我完全赞同Jason,但我不认为你想要做的事实上有助于测试覆盖率。毕竟,呈现它和测试行为已经涵盖了它是否存在。

当他们第一次被测试驱动的开发错误所困扰时,很多开发人员都会过火。他们希望测试失败告诉他们确切的错误,这样他们就不必深入挖掘和调试。这不是测试的主要目的;测试用于验证正确的行为,因此您不会发送错误的软件。当出现问题时,您可以进行调试。没有必要使测试工具如此具体,以至于测试引擎确切地知道问题是什么。

答案 3 :(得分:1)

您可以尝试使用ViewResult中ViewEngineCollection对象的FindView方法来检查MVC框架是否可以找到View。

正如其他人所说,我认为这个3'rd断言(视图实际存在)并不能为你的测试增加真正的价值,但不过,这里是检查存在的代码:

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

希望这有帮助。

答案 4 :(得分:0)

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

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