在单元测试期间使用资源

时间:2013-10-14 11:37:27

标签: c# visual-studio-2010 unit-testing

我是VS2010& C#。我正在尝试加载应该测试的文件。是否有类似maven的方法?或者最新的做法是什么?

我应该如何存储和加载我的测试资源?

我的方法是在测试项目中创建一个新文件夹,如

+MyTestProject
+-Properties
+-....
+-Resources
 +- MyFile.xml
 +- OtherFile.xls
 +-...
+...

//编辑:

我正在尝试针对生成的内容测试我的代码,因此我很想将这些内容加载到我的单元测试框架[ClassInitialize()]中,并为每个单元测试传递它们{{1 }}。所以我真的想加载磁盘上的文件。模拟也是一个很好的暗示,但对于这种情况,我更喜欢另一种方式。

2 个答案:

答案 0 :(得分:2)

您尝试将哪些资源用于UnitTesting项目?如果您要在单元测试中使用依赖项,那么它不是单元测试。

单元测试往往只测试一个独立的代码单元。如果你有依赖关系,那么你可以使用Mock框架伪造那些依赖资源。

如果您正在寻找集成测试,那么这是一个不同的案例。在这种情况下,您必须使用生产分支中的“文件作为链接”,而不是使用文件副本。

答案 1 :(得分:1)

您可以使用几种方法。一种是将文件部署为嵌入式资源,并在夹具/测试类初始化方法中在测试运行时提取它们。这种方法非常可靠(即,测试程序集的运行位置并不重要),但稍微复杂一些(您需要将文件标记为嵌入式资源,您需要了解嵌入文件时使用的命名约定 - 将基础资源放入程序集中,您需要熟悉Assembly.GetManifestResourceStream())。

或者,您可以使用“松散文件”(即未嵌入)。在这种方法中,您只需将文件标记为“始终复制”或“如果更新则复制” - 这将导致文件被复制到测试程序集的构建输出目录中。如果你使用NUnit,你可以在那里停下来。如果您使用的是MSTest(Visual Studio附带的),则需要在测试类或方法中添加[DeploymentItem]属性:

  [DeploymentItem("MyFile.xml"[, "someoptionalsubfolder"])]
  public void MyTest()
  {
      ...
  }

在上述两个方面,我建议您为资源采用文件夹结构/命名约定,以帮助您跟踪它们。像下面这样的东西对我来说效果很好。它受到ASP.NET MVC使用的文件夹结构的影响并且工作得非常好。在这种方法中,您可以拥有“共享”资源(即,在程序集或测试类级别对一组测试保持不变的东西),但每组测试甚至每个测试都可能有自己特定的资源版本(例如,用于测试“无效数据”响应或测试边缘情况):

  +-Resources
    +-Shared
      - SomeGlobalResource.xml
    +-TestClass1
      +-Shared
        - MockData.xml
      +-TestCase1
        - SpecialVersionofMockData.xml
      +-TestCase2
        - MockDataMissingRequiredInformation.xml
      +-TestCase3
        - EtCetera.xml
      +-...
    +-TestClass2
      +-Shared
      +-TestCase1
      +-TestCase2
      +-...
    +-TestClass3
    ...

顺便说一句,如果您遵循这种方法,这将极大地简化您在MSTest下使用DeploymentItem属性的方式。您可以简单地在类中放置一个复制整个Resource文件夹树的指令,而不是让自己疯狂并为每个资源文件维护一个属性:

  [DeploymentItem("Resources\\", "Resources")]
  [TestClass]
  public class MyTestClass()
  {
      ...
  }

编辑:我应该指出,您仍然需要管理测试内容的路径 - NUnit和MSTest都不提供基于当前执行测试自动生成路径的工具。这意味着在复制粘贴任何测试代码时,您必须保持警惕,保持正确的路径。