如何模拟DirectoryInfo类?

O.O*_*O.O 6 c# mocking .net-2.0

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

  public interface IDirectoryInfoWrapper
  {
    public IFileInfoWrapper[] GetFiles(string searchPattern, SearchOption searchType);
    public IDirectoryInfoWrapper[] GetDirectories();
  }
Run Code Online (Sandbox Code Playgroud)

我一直在使用代码替换DirectoryInfo IDirectoryInfoWrapper.一切顺利,直到我发现这个:

  // Check that the directory is valid
  DirectoryInfo directoryInfo = new DirectoryInfo( argPath );
  if ( directoryInfo.Exists == false )
  {
    throw new ArgumentException
        ("Invalid IFileFinder.FindFiles Directory Path: " + argPath);
  }
Run Code Online (Sandbox Code Playgroud)

将构造函数放在接口中是没有意义的,所以我应该如何处理这行代码:

DirectoryInfo directoryInfo = new DirectoryInfo( argPath );
Run Code Online (Sandbox Code Playgroud)

Pau*_*ips 5

我看到两个明显的选择:

  1. 替换DirectoryInfo为您自己的包装器实现(不理想)
  2. 创建一个可以创建IDirectoryInfoWrapper实例的工厂.你可以Create为你想要使用的每个构造函数创建一个带重载的函数.

我假设您使用依赖注入执行此操作,这意味着现在您只需将该工厂注入需要创建新目录信息对象的任何类.

此外,您还需要修改包装器接口以公开该Exists属性

编辑:如果你这样做试图对某些东西进行单元测试(这似乎很可能),那么你可以尝试阅读Misko Hevery.每次new在C#中使用运算符时,都有一个不能在运行时注入的东西.这使得new在任何但最简单的情况下使用任何东西都非常困难.对于任何不是简单数据对象的东西,我几乎总是使用工厂.

编辑二:

您将构造委托给工厂,因此您可以使用DirectoryInfo真正的构造函数:

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