我想创建一个简单的下载工具。给它一个urls列表,一个目标目录,然后点击go。然后,它将下载这些文件并将它们转储到目标目录中。很简单。
但是,我也想练习TDD。但是如何在这样的应用程序中执行TDD呢?我可以看到申请的四个主要部分:
不能真正的TDD用户界面。而下载和编写很可能是由普通的.net类完成的。它只剩下下载任务,它是一个哑容器,对TDD来说不是很有趣.
您将如何处理这样的应用程序?或者这是一种TDD没有真正意义的应用程序吗?
需要指点。不知道如何或从何处开始:p
发布于 2009-12-10 08:33:04
如果将逻辑从用户界面中分离出来,则可以使用TDD用户界面重的应用程序。简而言之,这就是MVC。下面是一种用类图表示的概念性方法(省略了模型):
+----------------------+ 1
| MyDownloadUI +--------------+
+----------+-----------+ |
| |
| implements |
v |
+----------------------+ | 1
| {interface} |1 1+--------+------------+
| DownloadView +-----+ DownloadController |
+----------------------+ +---------------------+您需要在用户界面上做的唯一一件事是实现DownloadView接口,并对DownloadController应该将其操作发送到哪里进行引用。当DownloadController需要操作UI (更具体地说,是视图)时,它只应该有一个对DownloadView接口的引用。构造函数应该如下所示:
//Sample of MyDownloadUI
DownloadController controller;
public MyDownloadUI {
this.controller = new DownloadController(this);
//...
}
//Sample of DownloadController
DownloadView view;
public DownloadController(DownloadView view) {
this.view = view;
//...
}这样,就可以在没有控制器的情况下更改UI,以考虑视图的外观或所有标签和列表的名称。
这样做的好处是您可以在下载控制器中使用TDD逻辑,并使用一个模拟来替换UI。
为了测试实际的UI,您实际上并不做单元测试本身,这将更多地是一个功能测试,因为MyDownloadUI与DownloadController紧密耦合(除非您为DownloadController创建一个接口)。对于这样的小项目,您几乎可以在更改UI或将新的东西连接到控制器时进行手动烟雾测试。
当您觉得一个类开始变得太多时,您总是可以选择将逻辑分解到另一个类(这使得TDD变得更容易)。您已经给出了一些示例,例如DownloadTask,它显然是一个模型类,所以这是一个很好的开始。然后有一个FileDownloader,它向一个FileWriter发送一个DownloadedFile。
我能想到的DownloadController最简单的实现就是一种方法:
goDownload(List<string> urls)想要开始下载时,MyDownloadUI调用的另一项建议是:
addUrl(string url)向下载控制器的内部列表添加一个urlclearUrls()删除内部列表中的所有urlsgoDownload(),它获取urls列表并启动“下载过程”有很多TDD教程,我最喜欢的是dnrTV上的让·保罗·波德胡(第1部分,第2部分)的视频。有很多东西要接受,但在实践中却显示出很多如何去做。
发布于 2009-12-10 08:09:52
你从更明显的开始。
我猜在您的用户界面后面,您将有一个主控制器,其方法类似于addFilePath()和hitGo()。你必须:
addFilePath()。hitGo()。在TDD中寻找起点时,您不必看得太远。如果您这样做了,这可能意味着您甚至不知道您的应用程序应该做什么。
在编写了第一个测试之后,应该会有更多的案例出现在您面前,从而允许您编写更多的测试。
发布于 2009-12-08 07:34:30
当然,您可以从编写测试开始:)。
https://stackoverflow.com/questions/1865241
复制相似问题