3

我是使用 VS2010 和 C# 进行单元测试的新手。我正在尝试加载应该测试的文件。有类似行家的方法吗?或者什么是最佳实践?

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

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

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

// 编辑:

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

4

2 回答 2

2

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

单元测试倾向于只测试一个独立的代码单元。如果您有依赖项,那么您可以使用 Mock 框架来伪造这些依赖资源。

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

于 2013-10-14T11:47:00.783 回答
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 都没有提供工具来根据当前执行的测试自动生成路径。这意味着在复制粘贴任何测试代码时,您必须警惕维护正确的路径。

于 2013-10-14T12:25:21.673 回答