Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 基于FullFileName的tdd新函数_C#_File_Tdd - Fatal编程技术网

C# 基于FullFileName的tdd新函数

C# 基于FullFileName的tdd新函数,c#,file,tdd,C#,File,Tdd,想象一下:我想创建新功能:扫描文件中的病毒 使用TDD,我想进行以下测试: 扫描受影响的文件返回值 扫描安菲尔返回序列 在代码中,我要创建此函数: /// <summary> /// /// </summary> /// <param name="fullFileName">The File To Scan</param> /// <returns>True: File is clean, Fals

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

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

  • 扫描受影响的文件返回值

  • 扫描安菲尔返回序列

在代码中,我要创建此函数:

/// <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();
    }
//
/// 
/// 
///要扫描的文件
///True:文件是干净的,False:文件包含病毒
公共静态bool扫描文件(字符串fullFileName)
{
//TODO:扫描给定的完整文件名
抛出新的NotImplementedException();
}

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

您遇到的问题是,这种方法通过获取文件路径来扫描文件,其责任太多,因此很难进行测试

  • 打开文件(并处理任何错误)
  • 读取文件的内容
  • 确定内容是否有错误
    *
  • 关闭文件
注释为
*
的项实际上就是这个方法应该做的所有事情。这样,您的方法将更易于测试

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

public bool ScanFile(IScannable file)
{

}
然后,假设您的扫描方法正在查找特定的字节序列,该接口可以简单到:

public interface IScannable
{
    byte[] GetContent();
}
然后,您的测试可以简单地模拟这个接口(请参见Rhino、NMock等)进行两个测试,一个返回错误的字节序列,另一个返回良好的字节序列。您真正的实现就像拥有一个具体的类一样简单:

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

    public byte[] GetContent()
    {
        return File.ReadAllBytes(this.fullFilename);
    }
}

对我来说,看起来是可以测试的。只需两次调用,一次调用好文件,一次调用坏文件???哇,我认为你对这个问题给出了一个非常好的答案。我认为这个例子将有助于解决许多TDD问题。@PcPulsar-谢谢,我希望如此。