【发布时间】:2012-02-15 16:50:14
【问题描述】:
技术栈:.NET 4、C#、NUnit
我正在尝试将测试驱动开发应用于执行图像处理的新项目。我有一个基类,其中包含共享文件 I/O 方法和执行各种特定处理算法的子类。据我了解,单元测试不会触及文件系统或其他对象,并模拟发生这种情况的行为。我的基类只包含简单的访问器和直接的文件系统 I/O 调用。
public class BaseFile
{
public String Path { get; set; }
public BaseFile()
{
Path = String.Empty;
}
public BaseFile(String path)
{
if (!File.Exists(path))
{
throw new FileNotFoundException("File not found.", path);
}
Path = path;
}
}
测试这些方法有什么价值吗?如果是这样,我该如何抽象出对文件系统的调用?
我的另一个问题是如何测试特定于一种图像文件(~200 MB)的子类。我搜索了该站点并找到了similarquestions,但没有人处理我在这个项目中使用的文件大小。一个类是否有可能进行集成测试(使用“黄金文件”),但没有单元测试?在这种情况下,我怎样才能严格遵循 TDD 方法并首先编写一个失败的测试?
【问题讨论】:
-
如果 TDD 难以应用或不足,请不要应用它。这不是灵丹妙药。
-
@CharlesB,我同意。不幸的是,这种情绪经常被用作不使用 TDD 的借口,而这样做实际上是正确和有利的。有时有很大的曲线或大量的基础工作要做,但这通常是有回报的。
-
@CharlesB 不确定我是否同意。问题是这个做一些工作的类没有经过测试,因此你改变它的信心就会减弱。问题是在 System.IO 中模拟静态方法并不容易,但这并不意味着放弃测试,只是意味着您需要做更多的工作才能使它们可测试。这就是 MS 引入 System.Web.HttpContextBase 的原因,以解决无法轻松模拟 HttpContext 的问题。我们不需要测试 httpContext,只要我们的代码正确地与之交互即可。
-
@CharlesB - TDD 是一门学科。它并不是真的要解决任何一个问题。它的作用是迫使您对代码应用干净的边界,并将自己与实现细节分离。作为副作用......你会得到一组测试。
标签: c# .net unit-testing nunit