关于c#:编写单元测试:如何以编程方式获取带有测试文件的文件夹

Writing Unit Tests: How to get folder with testfiles programmatically

我正在Visual Studio 2010中编写单元测试。为了测试一些功能,我添加了一个包含测试文件的文件夹。我需要以编程方式获取这个文件夹,而不需要字符串中的硬路径。

文件夹包含在/TestFiles

我试过用AppDomain.CurrentDomain.BaseDirectory。只有使用Resharper运行单元测试时,这才有效。结果是/bin/debug,所以我可以很容易地转到测试文件。

如果我使用Visual Studio运行测试,则basedirectory为:\TestResults\_ \Out

我已将解决方案文件移动到另一个文件夹。所以我的项目与我的解决方案文件不在同一个文件夹中。例子: = C:\SolutionFiles = C:\Projects\MyProject

有人能告诉我如何在不使用硬编码字符串的情况下获取测试文件的路径吗?

编辑我还没有找到解决办法。Visual Studio正在使用另一个生成文件夹进行测试。所以通常构建到bin文件夹中的所有内容都将构建到另一个文件夹中进行测试。

我的临时解决方案我在我的测试项目中添加了一个app.config文件。在此配置文件中,我添加了一个设置,其中包含到测试文件的所需路径:

1
</appSettings>

可以将此文件夹复制到具有deploymentem属性的单元测试的部署文件夹中。


即使这个问题已经得到了回答,我也希望能为我提供一个有效的解决方案,而其他人却没有。您需要将该文件复制到测试项目的bin目录,在其属性中标记该文件copy to ouput directory="copy always",然后在测试中,您可以使用此代码读取该文件:

1
2
3
4
var baseDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
var testFile = Path.Combine(baseDir,"TestFiles","file.txt");

var file = File.OpenRead(testFile))


最可靠的方法是使用testcontext。此对象具有部署路径、结果路径等的全部属性。请参见TestContext属性。


您可以使用Path.Combine(Assembly.GetExecutingAssembly().Location,"TestFiles")访问该文件夹,而不需要对任何内容进行硬编码。您必须确保将文件夹和文件添加到您的测试项目中,并适当地设置了它的CopyToOutput目录。


我们这样做:

1
2
3
var assembly = Assembly.GetAssembly(this.GetType());
var codebase = assembly.CodeBase.Replace("file:///","");
var baseDir = Path.GetDirectoryName(codebase);

此C代码段来自单元测试设置例程,并检索单元测试代码的目录。从这里你可以导航…我不认为它很优雅……但是:)


如果有像我这样的人出现,如果您使用的是.testsettings文件,并且类上的deploymentem属性不起作用,即使您已将文件设置为内容并始终复制,这是因为.testsettings文件中已经有部署节,或者需要在.testsettings文件中使用deploymentem。下面是我们现在的样子:

1
2
3
4
<Deployment>
    <DeploymentItem filename="Tests\Unit Tests\ConnectionStrings.config" />
    <DeploymentItem filename="Tests\Unit Tests\<project dir>\bin\Debug\TestFiles" outputDirectory="TestFiles" />
</Deployment>

一个做文件,另一个做目录中的13个文件。注意目录的"文件名"后面的斜杠!

解决方案和更多信息位于:

testsettings中的mstest deploymentem outputdirectory