c# - 将系统类作为构造函数参数传递

标签 c# tdd mocking

这可能是疯了。

我想将依赖注入(inject)的想法发挥到极致。我已将所有与 System.IO 相关的行为隔离到一个类中,以便我可以在我的其他类中模拟该类,从而减轻我的大型单元测试套件担心实际文件系统的负担。

但是我最终得到的 File IO 类只能通过集成测试进行测试,这当然会引入复杂性,我真的不想处理,而我真正想做的就是确保我的 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 类是静态类。据我所知,它们既不能以这种方式实例化,也不能为了模拟的目的而被子类化。

最佳答案

创建一个包含简单重定向到 System.IO 的函数的类。创建另一个伪造/模拟 System.IO 的类。让这两个类都实现一个公共(public)接口(interface)。那么您就不必担心 System.IO 充满了静态。

关于c# - 将系统类作为构造函数参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2652897/

相关文章:

ruby-on-rails - Rails Fixtures 与 Mocks

c# - 为单独的线程使用不同的 .config 文件 (.NET/C#)

c# - 当绑定(bind)的 ObservableCollection 更改时 ListView 不更新

c# - 将 NLog 与 NServiceBus 3 一起使用

unit-testing - 必要的契约(Contract)测试是否意味着 stub ?

java - 如何对 Eclipse 插件进行单元测试?

c# - 在 .NET 中获取默认的 Windows 系统颜色

php - 构建可伸缩(可扩展)、可维护和松耦合软件的最佳技术是什么?

java - 如何解决以下 stub 是不必要的 - Mockito - Android

java - 如何在静态方法中模拟对象?