单元测试的测试数据文件路径

64

我目前在VS 2008中使用标准的Microsoft Unit Test套件,同时安装了ReSharper 4.5。我的单元测试依赖于一个TestInitialize方法,该方法预加载数据文件。这个测试数据文件的路径将取决于我是使用标准的Ctrl-R + Ctrl-T命令在VS 2008中运行单元测试,还是使用Resharper单元测试执行命令。

我的TestInitialize方法如何知道正确的单元测试数据文件路径?

更新:

测试数据的大小足够大,我不想将其推入字符串中,因此希望将其保留为外部文件。我的测试项目文件结构与创建MVC应用程序时的标准单元测试项目相同。在测试项目的根目录下,创建了一个名为“Test Data”的新文件夹。无论使用哪种测试运行器,我都想访问这个文件夹。

2个回答

94
你的意思是测试文件的位置会因为测试运行器而不同,因此我认为它应该包含在项目中并与dll一起复制。
string path = AppDomain.CurrentDomain.BaseDirectory;

这将会让你得到你正在执行测试的文件夹。

[编辑]

在Visual Studio中,

Resharper -> 选项 -> 工具 -> 单元测试 -> 运行结果来自: 指定文件夹(或更改测试项目的项目输出文件夹)

在这里,您可以指定测试数据的文件夹,或相对于指定文件夹。


1
非常感谢。我正在使用ExecutingAssembly进行尝试,结果得到了一个指向我的Windows个人资料深处的奇怪路径。测试数据不在视线范围内... - Tormod
1
请注意,这将为您提供Test项目内\bin\Debug或\bin\Release文件夹的路径,例如“C:\Yadda\MyProject\bin\Debug”。 - Chris Moschini
1
请注意,至少对于Visual Studio 2019而言,如果您将文件放在解决方案的子文件夹中,则在复制时会保留文件夹结构。当然,请确保您的文件在解决方案资源管理器中具有“始终复制”或“仅在更新时复制”的属性。 - Pac0

24

它假设你的测试数据文件在一个名为"Test_Data"的根文件夹中,你将该文件夹作为参数"testDataFolder"传递:

public static string GetTestDataFolder(string testDataFolder)
{
    string startupPath = ApplicationEnvironment.ApplicationBasePath;
    var pathItems = startupPath.Split(Path.DirectorySeparatorChar);
    var pos = pathItems.Reverse().ToList().FindIndex(x => string.Equals("bin", x));
    string projectPath = String.Join(Path.DirectorySeparatorChar.ToString(), pathItems.Take(pathItems.Length - pos - 1));
    return Path.Combine(projectPath, "Test_Data", testDataFolder);
}

我需要包含什么才能使用ApplicationEnvironment? - miguelmpn
1
@miguelmpn 你可以使用 AppDomain.CurrentDomain.BaseDirectory。 - daniell89
ApplicationEnvironment 的 Nuget 包? - Kiquenet
假设构建输出目录为默认的 bin/Foo/net5.0。是否有可能通过获取 csproj 文件的路径来使其更加健壮? - Yarek T
@YarekT是一个老的答案,可能需要更新,我不确定,但也许使用IHostingEnvironment.ContentRootPath可以直接得到文件夹。 - DaniCE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接