模拟文件系统

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

1
如果你真的在谈论Typemock,那么你不应该有任何问题,因为Typemock可以模拟任何类型,包括密封类型。 - user1228
5
高喊“你的文件系统一文不值,脆弱无力”是嘲笑他们的好方法... - Steven A. Lowe
我认为Typemock无法模拟mscorlib中的东西,而这里有很多。除了DateTime.Now,也许可以。 - Sam Holder
@Sam - 你说得对。TypeMock无法模拟mscrolib中的对象,但是他们在研究Racer产品时找到了一种模拟DateTime的方法。 - Jason Evans
4个回答

9
文件系统是如何使用TDD驱动您朝着更好、更灵活的设计方向发展的绝佳示例。通常情况下,当您与文件系统交互时,可以使用流(Streams)或文本编写器(TextWriters)来处理读写文件,而不是实际的文件。
这些都是抽象类型,因此很容易进行模拟(mock)。
现在,您拥有了更加灵活的API,因为它没有与文件系统紧密耦合,但仍然支持文件操作。

3
使用流式处理非常好,因为这样可以与各种输入/输出设备保持兼容。 - Thorsten79

3
你基本上有两个选择:要么将所有文件系统相关的逻辑抽象到一个 IFileSystemService 后面,要么使用来自 Microsoft 的 Stubs,它是一个轻量级的 .NET 框架,提供了测试存根。对于接口和非密封类,会生成类型安全的包装器,可以通过附加委托进行轻松定制。

1

免责声明:我在Typemock工作。

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

  • File
  • Directory
  • FileStream

这里有一个简短的例子:

public void Test()
{
    string path = @"C:\TypemockCan.txt";

    Isolate.WhenCalled(() => File.Exists(null)).WillReturn(true);

    Assert.IsTrue(File.Exists(path));
}

查看更多示例



网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接