我正在 Visual Studio 2010 中编写单元测试。
为了测试一些功能,我添加了一个包含测试文件的文件夹。
我需要以编程方式获取此文件夹,而无需字符串中的硬路径。
该文件夹包含在
<projectDirectory>/TestFiles
我尝试过使用
AppDomain.CurrentDomain.BaseDirectory
。
仅当我使用 resharper 运行单元测试时,这才有效。<projectDirectory>/bin/debug
所以我可以轻松地转到 TestFiles。
如果我使用 Visual Studio 运行测试,则 BaseDirectory 是:
<sameFolderAsSolutionFile>\TestResults\<username>_<pcname> <datatime>\Out
我已将解决方案文件移至另一个文件夹。所以我的项目与我的解决方案文件不在同一文件夹中。
示例:
<sameFolderAsSolutionFile> = C:\SolutionFiles
<projectDirectory> = C:\Projects\MyProject
有人可以告诉我如何在不使用硬编码字符串的情况下获取测试文件的路径吗?
编辑
我还没找到解决办法。
Visual Studio 正在使用另一个构建文件夹进行测试。
因此,通常构建到 bin 文件夹中的所有内容都将构建到另一个文件夹中进行测试。
我的临时解决方案
我在我的测试项目中添加了一个 App.config 文件。
在此配置文件中,我添加了一个设置,其中包含测试文件所需的路径:
<appSettings>
<add key="TestFiles" value="C:\Projects\MyProject\TestFiles"/>
</appSettings>
您可以使用 DeploymentItem 属性将此文件夹复制到单元测试的部署文件夹中。
即使问题已经得到解答,我也想贡献一个对我有用的解决方案,而其他人却没有。 您需要将文件复制到测试项目的 bin 目录中,在其属性中标记该文件复制到输出目录=“始终复制”,然后在测试中您可以使用以下代码读取该文件:
var baseDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
var testFile = Path.Combine(baseDir, "TestFiles", "file.txt");
var file = File.OpenRead(testFile))
您可以使用
Path.Combine(Assembly.GetExecutingAssembly().Location,"TestFiles")
访问该文件夹,而无需进行任何硬编码。您必须确保将文件夹和文件添加到测试项目中,并正确设置其 CopyToOutput
目录。
我们这样做:
var assembly = Assembly.GetAssembly(this.GetType());
var codebase = assembly.CodeBase.Replace("file:///", "");
var baseDir = Path.GetDirectoryName(codebase);
此 C# 代码片段来自单元测试设置例程,并检索单元测试代码的目录。从这里您可以导航... 我不认为它很优雅......但是:)
如果像我这样的人出现,如果您在类上使用.testsettings文件和DeploymentItem属性不起作用,即使您已将文件设置为内容并始终复制,这是因为您的 .testsettings 文件中已经有 Deployment 部分,或者您需要在 .testsettings 文件中使用 DeploymentItem。 这是我们现在的样子:
<Deployment>
<DeploymentItem filename="Tests\Unit Tests\ConnectionStrings.config" />
<DeploymentItem filename="Tests\Unit Tests\<project dir>\bin\Debug\TestFiles\" outputDirectory="TestFiles" />
</Deployment>
一个做一个文件,另一个做一个目录下的13个文件。 请注意目录“文件名”的尾部斜杠!
解决方案和更多信息可在以下位置找到: