到目前为止,我创建了以下接口:
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 );发布于 2012-06-22 23:52:11
我认为有两个明显的选择:
DirectoryInfo替换为您自己的包装器实现(不太理想)IDirectoryInfoWrapper实例的工厂。您可以为每个要使用的构造函数创建一个具有重载的Create函数。我假设你是通过依赖注入来做这件事的,这意味着你现在只需要将工厂注入到任何需要创建新目录信息对象的类中。
此外,您还需要修改包装器接口以公开该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;
}
}发布于 2012-06-22 23:55:23
该链接提供了如何模拟文件类的示例,您需要对DirectoryInfo How do you mock out the file system in C# for unit testing?执行类似的操作
https://stackoverflow.com/questions/11159661
复制相似问题