C# 基于FullFileName的tdd新函数
想象一下:我想创建新功能:扫描文件中的病毒 使用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
- 扫描受影响的文件返回值
- 扫描安菲尔返回序列
/// <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-谢谢,我希望如此。