我应该在ASP.NET MVC3项目中进行单元测试?

时间:2012-05-02 17:46:39

标签: asp.net-mvc asp.net-mvc-3 unit-testing nunit

我是单元测试的新手。我有一个使用asp.net mvc3和s#arp lite的Web应用程序。我想在这个应用程序中添加单元测试。到目前为止,我对控制器类中的每个操作都进行了测试。只是好奇,我还需要测试什么?是否需要测试视图?

另一个问题,我在网上找到的所有测试示例都使用moq或其他工具制作假数据。我们还应该再次测试真实的数据库吗?

5 个答案:

答案 0 :(得分:5)

您既不应该测试视图也不应该对真实数据库进行单元测试。对代码级工件使用单元测试,例如控制器操作,操作过滤器,html助手,模型,用C#编写的任何东西。

要测试真实的数据库和视图,请查看集成测试。集成测试与单元测试不同,但您仍然可以使用像nunit这样的单元测试框架来执行它们。基本上,您只需使用Selenium WebDriver或Watin等编写测试代码来驱动浏览器。但这些并不是单元测试,它们是集成测试,端到端测试或用户验收测试。

答案 1 :(得分:4)

“测试直到无聊”

话虽如此,要小心通过集成测试完成大部分测试。 换句话说,一次测试1件事。 例如。您可能对测试感兴趣

  • 控制器逻辑
  • 路由逻辑
  • 数据库
  • 加载方法
  • 浏览

但不要在同一测试中测试2个或更多。  因此,如果您测试Controller逻辑,请传入或模拟正在使用的数据对象。

话虽如此,您可能也对“如何”测试这些部件感兴趣。我将在下面介绍3部分(数据库,加载函数,视图)

<强>数据库

在数据库中只需要测试两件事

  1. 是否已连接?
  2. 是架构正确
  3. 对于连接,我更喜欢回声测试

    Assert.AreEqual(42, QuerySingleResult("Select 42"));
    

    有许多方法可以测试数据库的元数据,但是如果你有一个版本号存储,你可以简单地测试它。这也使升级路径更容易。

    Assert.AreEqual(6, QuerySingleResult("Select version From Schema"));
    

    加载功能

    有许多方法可以测试加载函数(我将在这里展示一个简单的函数),但它们都依赖于将加载隔离到函数中。

    测试linq到...... 假设你有

    var people = From db in new EntityFrameworkContext().People Where ...... Select ....
    

    如果将其拆分为2个函数

    IEnumerable<People> LoadPeople()
    {
     return LoadPeople( new EntityFrameworkContext().People);
    }
    IEnumerable<People> LoadPeople(IEnumerable<People> fromPeople)
    {
     return From db in fromPeople Where ...... Select ....
    
    }
    

    现在很容易测试。

    <强>视图

    虽然视图很容易测试,但有很多细节。我会将您推荐给视频:http://www.youtube.com/watch?v=SttlPzwJw3U

    但是两个重要的部分是

    1)测试

    MvcApprovals.VerifyMvcPage(new YourController().YourTestAction
    

    2)控制器中的测试接缝

    public ActionResult YourTestAction()
    {
      // setup your model
      return View("viewpage", model);
    }
    

    快乐测试!

答案 2 :(得分:2)

测试任何可能包含错误的内容。观点有点难以测试,但这并不是一个坏主意。如果您正在寻找细节,请测试任何自定义属性,事件,静态方法,扩展方法以及其他任何实用程序。

如果您正在测试数据库,请确保它是专门用于测试的数据库。许多ORM也为您提供了模拟数据库的方法。

我个人是Ayehde(www.ayende.com)产品的粉丝,分别使用Rhino.Mocks和RavenDB作为我的模拟框架和数据库。

答案 3 :(得分:1)

如果视图中没有逻辑,则可能不需要对它们进行单元测试。您可能希望使用一些覆盖重要基本方案的端到端测试来补充您的单元测试,例如:硒。

是的,您希望在单元测试的同时进行数据库集成测试。

答案 4 :(得分:1)

根据定义,我们无法告诉您单元测试的内容,因为您正在测试您的代码,而不是框架代码。我们不知道你的代码是做什么的。只有你这样做。

单元测试框架代码没有任何意义,它已经过测试。您需要专注于编写涵盖逻辑的测试。