1

想象一下:我想创建新功能:扫描文件中的病毒。

使用 TDD 我想进行以下测试:

  • ScanningAnInfectedFileReturnsFalse

  • 扫描ACleanFileReturnsTrue

在代码中我想创建这个函数:

/// <summary>
    /// 
    /// </summary>
    /// <param name="fullFileName">The File To Scan</param>
    /// <returns>True: File is clean, False: File contains virus</returns>
    public static bool ScanFile(string fullFileName)
    {
        //TODO: Scan the given FullFileName
        throw new NotImplementedException();
    }

我的问题:如何使用给定的函数实现这两个测试?我认为应该重构该功能以使其可测试?

4

1 回答 1

3

您遇到的问题是,这种方法ScanFile通过获取文件的路径,具有太多的责任,这使得它难以测试。

  • 打开文件(并处理任何错误)
  • 读取文件内容
  • 判断内容是否有问题*
  • 关闭文件

带有注释的项目*实际上是该方法应该做的所有事情。这样,您的方法将更具可测试性。

实现此更改的一种可能方法是让该方法采用接口:

public bool ScanFile(IScannable file)
{

}

然后,假设您的扫描方法正在寻找特定的字节序列,接口可能很简单:

public interface IScannable
{
    byte[] GetContent();
}

然后,您的测试可以简单地为您的 2 个测试模拟此接口(参见 Rhino、NMock 等),一个返回错误的字节序列,一个返回良好的字节序列。您的实际实现就像拥有一个具体的类一样简单:

public class ScannableFile : IScannable
{
    private string fullFilename;
    public ScannableFile(string fullFilename)
    {
        this.fullFileName = fullFilename;
    }

    public byte[] GetContent()
    {
        return File.ReadAllBytes(this.fullFilename);
    }
}
于 2012-10-03T12:49:39.960 回答