gpt4 book ai didi

c# - 如何模拟 DirectoryInfo 类?

转载 作者:太空狗 更新时间:2023-10-29 21:35:17 25 4
gpt4 key购买 nike

到目前为止,我创建了以下接口(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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com