C# 如何模拟DirectoryInfo类?

C# 如何模拟DirectoryInfo类?,c#,mocking,.net-2.0,C#,Mocking,.net 2.0,到目前为止,我创建了以下界面: public interface IDirectoryInfoWrapper { public IFileInfoWrapper[] GetFiles(string searchPattern, SearchOption searchType); public IDirectoryInfoWrapper[] GetDirectories(); } 我已经阅读了用IDirectoryInfoWrapper替换DirectoryInfo的

到目前为止,我创建了以下界面:

  public interface IDirectoryInfoWrapper
  {
    public IFileInfoWrapper[] GetFiles(string searchPattern, SearchOption searchType);
    public IDirectoryInfoWrapper[] GetDirectories();
  }
我已经阅读了用
IDirectoryInfoWrapper
替换DirectoryInfo的代码。一切都很顺利,直到我发现:

  // Check that the directory is valid
  DirectoryInfo directoryInfo = new DirectoryInfo( argPath );
  if ( directoryInfo.Exists == false )
  {
    throw new ArgumentException
        ("Invalid IFileFinder.FindFiles Directory Path: " + argPath);
  }
将构造函数放在接口中是没有意义的,因此我应该如何处理这行代码:

DirectoryInfo directoryInfo = new DirectoryInfo( argPath );

我看到两个明显的选择:

  • 用您自己的包装器实现替换
    DirectoryInfo
    (不理想)
  • 创建一个可以生成
    IDirectoryInfoWrapper
    实例的工厂。您可以为要使用的每个构造函数创建一个带有重载的
    Create
    函数
  • 我假设您使用依赖项注入来实现这一点,这意味着您现在只需将工厂注入任何需要创建新目录信息对象的类中

    此外,您还需要修改包装器接口以公开
    存在的属性

    编辑:如果您这样做是为了尝试单元测试某些东西(看起来很可能),那么您可以尝试阅读。每次在C#中使用
    new
    操作符时,都会出现无法在运行时注入内容的情况。这使得在任何情况下都很难使用
    new
    测试任何东西,但最简单的情况除外。对于任何不是简单数据对象的对象,我几乎总是使用工厂

    编辑II

    您将构造委托给工厂,因此在工厂中使用
    DirectoryInfo
    real构造函数:

    class Factory : IFactory 
    {
      IDirectoryInfoWrapper Create(string arg)
      {
        var dirInfo = new DirectoryInfo(arg);
        var wrapper = new DirectoryInfoWrapper(dirInfo);
        return wrapper;
      }
    }
    

    该链接给出了一个示例,说明了如何模拟DirectoryInfo接口所需的文件类。当然,该接口没有构造函数,但它的实现是用构造函数实现的。您仍然可以使用真正的
    DirectoryInfo
    对象,只需一层间接寻址。如果您使用这个类(我假设)编写单元测试,那么现在您必须实际创建目录来测试它。与文件系统交互的单元测试是个坏主意,因为您不能真正控制文件系统,所以可能会出现各种问题。