代码之家  ›  专栏  ›  技术社区  ›  Yossale

包括C#项目中单元测试的资源文件

  •  12
  • Yossale  · 技术社区  · 14 年前

    我有一些读取和修改文件的函数。为了使单元测试独立于任何文件系统问题,我希望在项目中包含这些文件。

    但是,我的函数应该是获取文件路径,而我只能从程序集中获得一个文件流。你知道我怎样才能得到项目中资源文件的路径吗?

    System.Reflection.Assembly a = System.Reflection.Assembly.Load(assemblyName);
    FileStream stream = a.GetFile(assemblyName + "." + fileName);
    
    4 回复  |  直到 4 年前
        1
  •  8
  •   Pang Mohammad Imran    4 年前

    对于测试,这允许我传递一个MemoryStream,这样我就可以编写我的单元测试,而不用使用文件系统。有时甚至更容易检查数据是否正确写入,而且速度肯定更快,特别是对于更高数量的测试。你只需要记住在写了之后刷新MemoryStream,因为.NET并不总是自动地这样做。

    我的一个程序的示例:

    public TestSaveAndLoad()
    {
      [... create data to save ...]
      using (MemoryStream targetStream = new MemoryStream())
      {
        target.Save(targetStream);
        targetStream.Flush();
        targetStream.Seek(0, ...);
        target.Load(targetStream);
      }
      [... assert that the loaded data equals the saved data ...]
    }
    
        2
  •  4
  •   Mark Seemann    14 年前

    文件系统中不存在嵌入式资源,因此它没有任何文件路径。

    您有两种选择:

    • 更改的API SUT 所以它接受一个流而不是一个文件路径。这个解决方案是 更喜欢 .

    第一个解决方案是TDD如何推动我们朝着 更好、更灵活的API .

        3
  •  1
  •   tvanfosson    14 年前

    您可以设置在生成项目时要复制到bin目录的数据文件,然后通过 Directory.GetCurrentDirectory() 在你的测试中。或者甚至把它们留在原来的位置,简单地使用基于当前目录的相对路径。

        4
  •  0
  •   jeriley    14 年前

    如果将文件的构建操作设置为“复制”,则可以预测文件应该位于何处(可能是一堆…\..\但仍然是)。我猜您在方法中输入了一个文件名,所以应该可以正常工作。