【问题标题】:Mocking filesystem模拟文件系统
【发布时间】:2010-02-15 14:36:50
【问题描述】:

如果我的单元测试依赖于文件系统并且我需要模拟它,那么最好的方法是什么?

谢谢

【问题讨论】:

  • 如果您实际上是在谈论 Typemock,那么您应该没有问题,因为 Typemock 可以模拟任何类型,包括密封类型。
  • 高呼“你的文件系统一文不值而且很弱”是嘲笑他们的好方法......
  • 我认为 Typemock 无法模拟 mscorlib 中的内容,其中很多内容都在其中。除了 DateTime.Now。也许吧。
  • @Sam - 你是对的。 TypeMock 无法模拟 mscrolib 中的对象,但他们确实在对 Racer 产品的研究过程中找到了模拟 DateTime 的方法。

标签: .net unit-testing typemock


【解决方案1】:

文件系统是一个很好的例子,说明 TDD 如何推动您实现更好、更灵活的设计。通常,当您与文件系统交互时,您可以使用 Streams 或 TextWriters 而不是实际文件来处理文件的读取和写入。

这些都是抽象类型,因此很容易模拟。

现在您有了一个更灵活的 API,因为它没有与文件系统紧密耦合,但仍然支持文件操作。

【讨论】:

  • +1,使用流非常棒,因为您可以与各种输入/输出设备保持兼容。
【解决方案2】:

您基本上有两个选择:要么将所有与文件系统相关的逻辑抽象到 IFileSystemService 后面,要么使用 Microsoft 的 Stubs,即

...提供测试存根的.NET 轻量级框架。对于接口和非密封类,会生成类型安全的包装器,可以通过附加委托轻松自定义。

【讨论】:

    【解决方案3】:
    【解决方案4】:

    免责声明我在 Typemock 工作。

    我很高兴地说,我们的最新版本支持以下类型的 System.IO 被模拟:

    • 文件
    • 目录
    • 文件流

    有一个简短的例子:

    public void Test()
    {
        string path = @"C:\TypemockCan.txt";
    
        Isolate.WhenCalled(() => File.Exists(null)).WillReturn(true);
    
        Assert.IsTrue(File.Exists(path));
    }
    

    查看更多examples。

    【讨论】:

      猜你喜欢
      • 2012-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-21
      • 1970-01-01
      相关资源
      最近更新 更多