代码之家  ›  专栏  ›  技术社区  ›  Ron Klein Noa Kuperberg

需要:文件系统接口和.NET中的实现[重复]

  •  12
  • Ron Klein Noa Kuperberg  · 技术社区  · 16 年前

    可能重复:
    How do you mock out the file system in C# for unit testing?

    我使用Moq作为模拟框架,为代码编写单元测试。
    我的代码包括对文件系统的调用,使用直接调用 System.IO File.Exists(...)
    我想把代码改成更易测试的,所以我应该有一个接口,比如 IFile ,用相关的方法,比如 Exists(string path)
    我知道我可以从头开始编写它,但我认为可能有一个完整、健壮的框架,它同时具有文件系统的接口和实现。这个(期望的)框架也可能是某种“服务”,因此它的API不必是与服务的“接口等价物” System.IO
    请注意,我真的希望有接口(和

    到目前为止,我得到的是:

    • 某种程度上相似,但 not the same question 在stackoverflow中被问到
    • 在里面 codeplex.com 有一个名为 ( link )在源代码中有这样的类(参见 /Source/TfsLibrary/Utility/ (在源代码中查看具体细节)

    还有其他建议吗?

    6 回复  |  直到 4 年前
        1
  •  6
  •   Mauricio Scheffer    16 年前

    I've written adapters System.IO.File Directory 方法。然后在我的课堂上,我做了以下几点:

    public class MyService {
      public IFile File {private get;set;}
      public MyService() {
        File = new FileImpl();
      }
      public void DoSomething() {
        File.ReadAllText("somefile");
      }
    }
    

    然后您可以注入一个模拟文件作为IFile进行测试。

        2
  •  5
  •   Charlie Flowers    16 年前

    好的,我没有你想要的文件系统模拟库(虽然它可能在某处,而且会很酷),但这可能会有所帮助。单元测试思想的“行为主义”学派提出的一个有趣的概念是“外向接口”的概念。在某些情况下,将一个对象对其自身之外的整个宇宙的调用,并将其转化为一个接口,似乎有着与为外部世界可以调用的方法创建接口的典型行为一样的价值 在…上

    在这种情况下,您可能会考虑,而不是嘲笑整个文件系统,为您的对象从外部世界提供的答案和服务提供一个或多个逻辑上一致的接口。这些电话只会回答你需要回答的问题。。。不要求执行。然后,您可以使用您提到的依赖项注入来注入您希望用于测试的实现。你可能会用最小起订量来做,因为你很熟悉它。

    因此,您的“传出接口”可能有一个名为DoesFileExist()的方法。它可能接受一条路径。或者,如果您的对象试图回答一个“更高级别”的业务问题,那么查看文件是否存在只是一个简单的问题 方法 这个问题得到了回答,那么您的传出接口可能根本就没有关于文件存在的方法。相反,它可能类似于“DoIAppearToHaveAccessToTheFileServer”,甚至可能是“IsthereapPreviouslySavedName”。

    这是一些工作,但可能更符合良好单元测试的原则。。。让您的测试对象表达它试图做什么,让您的单元测试测试它,并且只测试它。只是一个想法。。。希望能有帮助。

        3
  •  3
  •   Steve Guidi    15 年前

    我保持 Jolt.NET Jolt.Testing 图书馆获取更多信息。

        4
  •  2
  •   TrueWill    14 年前
        5
  •  0
  •   Steve Guidi    15 年前

    我知道 Typemock 包可以做这样的事情。

        6
  •  -1
  •   rektide    16 年前

    Mono.Fuse FUSE ,用户空间中的文件系统。我不确定如果需要任何移植来获取 Dokan ,FUSE for Windows,但FUSE在Linux、OSX和Solaris上运行良好。