首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何模拟DirectoryInfo类?

如何模拟DirectoryInfo类?
EN

Stack Overflow用户
提问于 2012-06-22 23:46:59
回答 2查看 7.6K关注 0票数 7

到目前为止,我创建了以下接口:

代码语言:javascript
复制
  public interface IDirectoryInfoWrapper
  {
    public IFileInfoWrapper[] GetFiles(string searchPattern, SearchOption searchType);
    public IDirectoryInfoWrapper[] GetDirectories();
  }

我已经看过了用IDirectoryInfoWrapper替换DirectoryInfo的代码。一切都很顺利,直到我发现了这个:

代码语言:javascript
复制
  // Check that the directory is valid
  DirectoryInfo directoryInfo = new DirectoryInfo( argPath );
  if ( directoryInfo.Exists == false )
  {
    throw new ArgumentException
        ("Invalid IFileFinder.FindFiles Directory Path: " + argPath);
  }

将构造函数放在接口中没有任何意义,那么我应该如何处理这行代码:

代码语言:javascript
复制
DirectoryInfo directoryInfo = new DirectoryInfo( argPath );
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-06-22 23:52:11

我认为有两个明显的选择:

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

我假设你是通过依赖注入来做这件事的,这意味着你现在只需要将工厂注入到任何需要创建新目录信息对象的类中。

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

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

编辑II

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

代码语言:javascript
复制
class Factory : IFactory 
{
  IDirectoryInfoWrapper Create(string arg)
  {
    var dirInfo = new DirectoryInfo(arg);
    var wrapper = new DirectoryInfoWrapper(dirInfo);
    return wrapper;
  }
}
票数 6
EN

Stack Overflow用户

发布于 2012-06-22 23:55:23

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11159661

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档