单元测试;正确的做法?

时间:2015-12-18 16:38:37

标签: c# visual-studio unit-testing visual-studio-2013

在工作中,我被要求增加我们在某个软件产品中的代码覆盖率。我之前从未进行过单元测试,并且已经在线阅读过一些教程;这些都是有用的起点,但都遵循相同的模式 - 他们正在测试非常简单的方法/类,如计算器或银行帐户。

我已经在我们的代码中找到了一个简单的方法来启动,但问题是它仍然比我读过的示例复杂得多,而且我不确定在哪里开始。这是方法:

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);
}

这是沿着应该测试的正确线路吗?或者我是以错误的方式看待这个?

1 个答案:

答案 0 :(得分:5)

您的单元测试应该测试该方法是否按预期执行。您的moveFiles方法应该移动文件,因此您需要测试它是否移动文件。

这是如何做到的:

  1. 在测试项目的app.config中,设置RootLocDropBoxLocation以测试目录。

  2. 在您的测试方法中:

    一个。通过在RootLoc中创建一些测试文件来设置测试环境。确保DropBoxLocation为空。

    湾调用你的moveFiles方法。

    ℃。断言DropBoxLocation包含您期望的文件。

    d。清理(​​即删除测试文件)。

  3. 理想情况下,步骤a和d可分别在TestInitializeTestCleanup方法中完成。此外,您可能希望将方法拆分为两种方法:

    public static void moveFiles(string source, string destination)
    {
        ...
    }
    
    public static void moveFiles()
    {
        moveFiles(ConfigurationManager.AppSettings["RootLoc"],
                  ConfigurationManager.AppSettings["DropBoxLocation"]);
    }
    

    这将允许您独立测试moveFiles方法,而不依赖于外部配置文件。这是依赖注入的一个非常简单的例子 - 如果你的方法难以测试,你可能想要阅读它。