【发布时间】:2013-05-14 11:06:11
【问题描述】:
我正在努力养成编写单元测试的习惯,我以前写过一些,但它们通常都很基础......我想开始转向 TDD,因为我想提高我的代码质量(设计和结构) - 减少耦合,同时希望减少滑入可测试构建的回归数量。
我开始着手一个相对简单的项目。生成的程序监视一个文件夹,然后对该文件夹中的文件进行操作。
下面是从项目中提取的一些代码的典型示例:
private string RestoreExtension(String file)
{
var unknownFile = Path.GetFileName(file);
var ignoreDir = Path.GetDirectoryName(file) + "\\Unknown";
string newFile;
//We need this library for determining mime
if (CheckLibrary("urlmon.dll"))
{
AddLogLine("Attempting to restore file extension");
var mime = GetMimeType(BufferFile(file, 256));
var extension = FileExtensions.FindExtension(mime);
if (!String.IsNullOrEmpty(extension))
{
AddLogLine("Found extension: " + extension);
newFile = file + "." + extension;
File.Move(file, newFile);
return newFile;
}
}
else
{
AddLogLine("Unable to load urlmon.dll");
}
AddLogLine("Unable to restore file extension");
if (!Directory.Exists(ignoreDir))
{
Directory.CreateDirectory(ignoreDir);
}
var time = DateTime.Now;
const string format = "dd-MM-yyyy HH-mm-ss";
newFile = ignoreDir + "\\" + unknownFile + "-" + time.ToString(format);
File.Move(file, newFile);
return String.Empty;
}
问题:
如何使用 IO 测试方法? 我真的不想使用真正的文件,因为这会很慢(而且更多的是集成测试?),但我真的看不到另一种方式。我可以添加一个可切换的 IO 抽象层,但这听起来可能会使代码不必要地复杂化......
这样的项目值得进行单元测试吗? 我的意思是,是不是太简单了。一旦你去掉 .Net 和 3rd 方库调用,剩下的就不多了……那么,使它可测试的工作量意味着它不是一个好的测试候选者吗?
这个项目中的很多方法都是私有的,因为这个项目恰好是一个 Windows 服务。我读过你应该只测试外部可见的方法(公共或通过接口公开),在这种情况下不太可能但是我想公开我自己的任何方法。那么这个项目是否值得测试(因为 id 可能需要将方法访问修饰符更改为 public 或添加一些属性以便 NUnit 可以看到它们)?
【问题讨论】:
-
我知道这是旧的,但使用 Microsoft Fakes 更容易
标签: c# unit-testing mocking tdd nunit