c# - 如何模拟 DirectoryInfo 类?

标签 c# mocking .net-2.0

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

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

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

DirectoryInfo directoryInfo = new DirectoryInfo( argPath );

最佳答案

我看到两个明显的选择:

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

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

此外,您可能希望修改包装器接口(interface)以公开该 Exists 属性

编辑:如果你这样做是为了尝试对某些东西进行单元测试(这似乎很可能),那么你可以尝试阅读 Misko Hevery .每次在 C# 中使用 new 运算符时,都会遇到无法在运行时注入(inject)某些内容的问题。这使得除了最微不足道的情况外,很难使用 new 测试任何东西。对于任何不是简单数据对象的东西,我几乎总是使用工厂。

编辑二:

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

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

关于c# - 如何模拟 DirectoryInfo 类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11159661/

相关文章:

python - 实例化模拟对象时,模拟属性返回值被覆盖

node.js - 使用 Jest 模拟 aws-sdk S3#putObject 实例方法

c# - 获取当前类的名称

c# - 在 web 服务的生命周期内共享 web 服务变量?

c# - 在 FlowDocument 中启用嵌入式控件

c# - 自动倒计时调整数据库记录

c# - 如何使用 WebBrowser 控件捕获 JSON 响应

c# - Azure DevOps 测试数据库

unit-testing - 在 Spock 单元测试中,没有调用模拟方法

c# - 使用 Ajax 自动完成