您可以使用几种方法。一种是将文件部署为嵌入式资源,并在测试运行时以夹具/测试类初始化方法提取它们。这种方法非常可靠(即,无论在哪里运行测试程序集),但稍微复杂一些(您需要将文件标记为嵌入资源,您需要了解嵌入文件时使用的命名约定-基于资源的程序集,您需要熟悉 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 都没有提供工具来根据当前执行的测试自动生成路径。这意味着在复制粘贴任何测试代码时,您必须警惕维护正确的路径。