如何模拟DirectoryInfo类?

时间:2012-06-22 15:46:59

标签: c# mocking .net-2.0

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

  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 );

2 个答案:

答案 0 :(得分:5)

我看到两个明显的选择:

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

    此外,您还希望修改包装器接口以公开Exists属性

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

    编辑II

    您将构造委托给工厂,这就是您使用DirectoryInfo真实构造函数的地方:

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

答案 1 :(得分:1)

该链接提供了如何模拟您需要为DirectoryInfo执行类似的File类的示例How do you mock out the file system in C# for unit testing?