2010-04-16 71 views
1

这可能是疯狂的。传递系统类作为构造函数参数

我想把依赖注入的想法变为极端。我已将所有与System.IO有关的行为隔离到一个类中,以便我可以在其他类中嘲笑该类,从而减轻我的更大的单元测试套件对担心实际文件系统的负担。

但文件IO类我最终只能与集成测试,测试which-- course--的增加了复杂性我真的不希望处理当所有我真正想要做的就是确保我的FileIO类调用正确的System.IO东西。我不需要集成测试System.IO。我的FileIO类不仅仅是简单地包装System.IO函数,现在它每次都包含一些逻辑(也许这就是问题所在)。

所以我想是能够测试我的文件IO类,以确保它使通过嘲讽System.IO类本身正确的系统调用。理想情况下,这将是那么容易,因为有像这样一个构造函数:

public FileIO(
     System.IO.Directory directory, 
     System.IO.File file, 
     System.IO.FileStream fileStream 
    ) 
    { 
     this.Directory = directory; 
     this.File = file; 
     this.FileStream = fileStream; 
    } 

然后在类似的方法调用:

public GetFilesInFolder(string folderPath) 
    { 
     return this.Directory.GetFiles(folderPath) 
    } 

但这个因为有关System.IO类不飞是静态的类。据我所知,它们既不能以这种方式实例化,也不能为了嘲弄而被分类。

回答

5

创建一个包含简单重定向到System.IO的函数的类。制作另一个伪造/嘲笑System.IO的课程。这两个类都实现了一个通用接口。那么你不必担心System.IO充满静态的事实。

1

每当你想从框架保护自己,你不希望在你的设计内部的东西,简单的写一个理想的接口,你想要它。意思是说,如果你只需要File.Exists(),File.Delete()和File.OpenRead(),然后编写一个简单的接口,只有你实际需要这些方法。

之后,你写的周围,实现你的接口,并成功地隐藏你试图让远离框架咕实际的框架实现一个包装类。

我做这与大多数的用户通过静态变量访问的HttpContext东西带点项目。你可以看到这个在这里一个例子:

http://github.com/dotless/dotless/blob/master/src/dotless.Core/Abstractions/IResponse.cs

IResponse是我的简单的界面,不正是我需要做的。 CssResponse中的代码可以通过集成测试进行测试,但现在我只是假设它可以工作,因为我从来没有碰过它,它非常简单。无论何时我需要使用IResponse接口来测试一个类时,我只需注入一个模拟对象或一个假的对象。

问候丹尼尔

相关问题