【问题标题】:Test-driven development with ASP.NET MVC - where to begin?使用 ASP.NET MVC 进行测试驱动开发 - 从哪里开始?
【发布时间】:2010-12-19 18:55:52
【问题描述】:

我阅读了很多关于测试驱动开发 (TDD) 的文章,根据个人经验,我发现这些原则非常引人注目。

目前我正在为我参与的一个初创项目开发一个网站,我想尝试将 TDD 付诸实践。

所以...我在 Visual Studio 2010 中创建了一个空白解决方案,添加了一个 ASP.NET MVC 网站项目和一个测试项目。

我还为我的域对象添加了一个名为“Domain”的类库,并为此添加了一个测试项目。

现在我想知道从哪里开始。我应该在做任何正确的事情之前写一个测试吗?问题是——我应该开始为域对象编写测试吗?如果是这样,由于域对象还不存在,我究竟应该测试什么?

或者我应该从网站项目开始并为此编写测试吗?如果是这样,我应该为什么编写测试? Home 控制器/索引操作?

【问题讨论】:

    标签: asp.net-mvc tdd


    【解决方案1】:

    我通常首先为我要开发的应用程序收集一组故事。从那我生成一个域模型,通常在“纸”上。我组织了我将要实现的故事,并开始在数据库中为第一组故事创建域模型。

    一旦我有了初始数据库,我就会使用 ORM,在我的例子中是 LINQ to SQL,将数据库表映射到一组初始类。我通常不会对生成的代码进行单元测试,所以这给了我相当多的代码作为开始的基础。然后我创建一个存根方法,它抛出一个未实现的异常,以实现我正在使用的第一个域类的一个特性。通常,我从验证逻辑开始。一旦有了存根方法,就可以使用 VS 右键菜单为该方法创建一个或多个单元测试。那你就上路了。

    一旦我完成了第一个故事的领域对象,我就开始使用 MVC 方面。首先,我将为第一个视图创建视图模型。在这一点上,这些通常只是一个空容器类。然后我将创建视图并将其强输入到视图模型中。我将开始充实视图,根据视图的需要向视图模型添加属性。请注意,由于视图模型只是一个容器,因此通常没有与之关联的单元测试。然而,它将用于后续的控制器测试。

    一旦视图完成(或者至少我的初始概念已经完成),然后我为它创建一个或多个存根控制器操作,存根方法再次简单地抛出一个未实现的异常。这足以让它编译并让我使用工具为其创建单元测试。我会根据需要继续测试方法并确保它对给定的输入进行适当的操作并生成适当的视图模型。如果该方法可以生成多个视图模型,即渲染多个视图,我可能会迭代创建视图模型/视图/控制器代码的过程,直到一个或多个故事完成。

    根据需要重复,直到实现您的故事集,并在此过程中进行重构。

    【讨论】:

    • “组织我将要实施的故事”是什么意思?如何组织故事?以哪种方式??
    【解决方案2】:

    在 C# 等静态语言中,甚至在声明要测试的类之前编写单元测试似乎有点极端。因此,您首先声明您的域类,抛出一些定义您将在这些域对象上执行的操作的接口,然后添加一个将实现接口的类,让方法只抛出NotImplementedException。那时你可以为这个类编写一个单元测试,因为所有类型都是已知的。您运行将失败的测试,然后实现该方法并再次运行测试 - 它会通过。然后你可以重构和优化你的实现,你的单元测试应该仍然通过。

    一旦你有了一个好的域模型和数据访问层,你就可以移动到你创建控制器的 web 项目,使用你之前定义的接口(通过创建一个接受这个接口的构造函数)。您可以通过将接口替换为模拟对象来为此控制器编写单元测试,以便您可以独立于数据访问代码来测试控制器操作。

    最重要的是:不要害怕添加类和接口。我见过人们编写大量的方法,这些方法同时执行多项操作,而且很难测试。尝试将不同的任务隔离为您可以轻松编写规范的方法:您期望不同可能输入的输出。

    【讨论】:

      【解决方案3】:

      对于长答案,您应该采取这样的小步骤。

      1)-先写一个失败的测试

          [Test]
          public void AddSameTag()
          {
              UserMovie userMovie = new UserMovie();
      
              userMovie.AddTag("action", "dts", "dts");
              Assert.AreEqual(2, userMovie.Tags.Count);
          }
      

      2)- 编写最简单的代码以通过测试。

      public virtual void AddTag(params string[] tags)
          {
              foreach (var text in tags)
              {
                  Tag tag =new Tag(text.Trim());
                  if (!movieTags.Contains(tag))
                      movieTags.Add(tag);
              }
          }
      

      3)- 重构

      。 对于 ASP.NET MVC 和 TDD starter,您可以忽略 Controller Test 并通过 TDD 专注于 Domain。

      【讨论】:

        【解决方案4】:

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-11-23
          相关资源
          最近更新 更多