【发布时间】:2016-03-25 10:18:06
【问题描述】:
在工作中,我被要求增加我们在其中一款软件产品中的代码覆盖率。我以前从未做过单元测试,并且在网上阅读了许多教程;这些作为起点很有帮助,但都遵循相同的模式——它们正在测试非常简单的方法/类,如计算器或银行账户。
我在我们的代码中找到了一个简单的开始方法,但问题是它仍然比我读过的示例复杂得多,我不确定从哪里开始。方法如下:
public static void moveFiles {
string rootDir = ConfigurationManager.AppSettings["RootLoc"];
string dropboxLoc = ConfigurationManager.AppSettings["DropBoxLocation"];
DirectoryInfo dropbox = new DirectoryInfo(dropboxLoc);
folders = dropbox.GetDirectories("*", SearchOption.AllDirectories);
string path = "";
string prevPath = "";
foreach (DirectoryInfo di in folders)
{
FileInfo[] files = di.GetFiles();
foreach (FileInfo fi in files)
{
prevPath = fi.FullName;
string[] p = prevPath.Split(new string[] { dropbox.Name }, StringSplitOptions.None);
path = rootDir + p[1];
fi.MoveTo(path);
}
}
}
我为此创建了一个小测试方法:
[TestMethod]
public void GetDirectories_ValidLocation_SetsDropboxLocation()
{
string dropboxLoc = ConfigurationManager.AppSettings["DropBoxLocation"];
DirectoryInfo dropbox = new DirectoryInfo(dropboxLoc);
Assert.IsTrue(dropbox.Exists);
}
这是否符合应测试的内容?还是我看错了?
【问题讨论】:
-
我可能忽略了一些东西,但是您要测试的方法永远不会在您的测试中调用...
-
您的代码似乎从给定位置的每个目录中获取每个文件,并将它们移动到不同的位置。您编写的测试必须确认该行为。您当前的测试确认存在起始位置,这很好,但只是您问题的 0.1%。
-
@Heinzi 这就是我感到困惑的地方;在很多简单的例子中,这正是发生的事情。但是,在阅读复杂代码时,不建议调用复杂方法,因为您不再关注单个工作单元,而是方法中的大量工作单元。所以我不确定我的尝试是否是正确的方法:)
-
这是您发现需要多次重构代码的地方。您发现您的代码完成了工作,但很难测试,因此您将其分解为更小的部分,通常带有您可以管理和替换的依赖项。 (这也是一些人/组织决定跳过单元测试的地方。)
-
对这种方法进行适当的单元测试将涉及构建文件系统 Mock 并添加对它的依赖(而不是直接调用 DirectoryInfo / Move)。这确实比我建议的初始测试要大得多……Heinzi's answer 是某种解决方法,但有些人可能不会将这种方法称为“单元测试”,而是称为集成测试。
标签: c# visual-studio unit-testing visual-studio-2013