C# 如何模拟DirectoryInfo类?
到目前为止,我创建了以下界面:C# 如何模拟DirectoryInfo类?,c#,mocking,.net-2.0,C#,Mocking,.net 2.0,到目前为止,我创建了以下界面: public interface IDirectoryInfoWrapper { public IFileInfoWrapper[] GetFiles(string searchPattern, SearchOption searchType); public IDirectoryInfoWrapper[] GetDirectories(); } 我已经阅读了用IDirectoryInfoWrapper替换DirectoryInfo的
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 );
我看到两个明显的选择:
DirectoryInfo
(不理想)IDirectoryInfoWrapper
实例的工厂。您可以为要使用的每个构造函数创建一个带有重载的Create
函数存在的属性
编辑:如果您这样做是为了尝试单元测试某些东西(看起来很可能),那么您可以尝试阅读。每次在C#中使用new
操作符时,都会出现无法在运行时注入内容的情况。这使得在任何情况下都很难使用new
测试任何东西,但最简单的情况除外。对于任何不是简单数据对象的对象,我几乎总是使用工厂
编辑II:
您将构造委托给工厂,因此在工厂中使用DirectoryInfo
real构造函数:
class Factory : IFactory
{
IDirectoryInfoWrapper Create(string arg)
{
var dirInfo = new DirectoryInfo(arg);
var wrapper = new DirectoryInfoWrapper(dirInfo);
return wrapper;
}
}
该链接给出了一个示例,说明了如何模拟DirectoryInfo接口所需的文件类。当然,该接口没有构造函数,但它的实现是用构造函数实现的。您仍然可以使用真正的DirectoryInfo
对象,只需一层间接寻址。如果您使用这个类(我假设)编写单元测试,那么现在您必须实际创建目录来测试它。与文件系统交互的单元测试是个坏主意,因为您不能真正控制文件系统,所以可能会出现各种问题。