编写单元测试:如何以编程方式获取包含测试文件的文件夹

Posted

技术标签:

【中文标题】编写单元测试:如何以编程方式获取包含测试文件的文件夹【英文标题】:Writing Unit Tests: How to get folder with testfiles programmatically 【发布时间】:2011-05-30 09:32:52 【问题描述】:

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

文件夹包含在<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>

【问题讨论】:

【参考方案1】:

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

【讨论】:

这正是我要找的地方。谢谢!【参考方案2】:

即使问题已经得到解答,我也想贡献一个对我有用的解决方案,就像其他人一样。 您需要将文件复制到测试项目的 bin 目录,在其属性中将文件标记为 Copy to ouput directory = "Copy always",然后在测试中您可以使用以下代码读取文件:

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

var file = File.OpenRead(testFile))

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

您可以使用Path.Combine(Assembly.GetExecutingAssembly().Location,"TestFiles") 访问该文件夹,而无需进行任何硬编码。您必须确保已将文件夹和文件添加到测试项目中,并已正确设置其 CopyToOutput 目录。

【讨论】:

Location 返回包含测试 DLL 名称的完整路径。您需要使用 Path.GetDirectoryName() 来获取路径。【参考方案5】:

我们这样做:

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

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

【讨论】:

感谢您的回答,但此代码将引用 C:\Projects\TestResults\_\Out 文件夹而不是项目文件夹(C:\Projects\UnitTest \压缩测试)。所以我需要开发单元测试的项目文件夹,而不是 Visual Studio 复制程序集文件仅用于单元测试的文件夹。 或许你应该注意Location和CodeBase的区别?反正看看:***.com/questions/52797/… 好肉汁,有很多不同的方法!难道不应该有一种简单、权威的方法来做到这一点吗?【参考方案6】:

万一像我这样的人出现,如果您使用的是 .testsettings 文件,并且类上的 DeploymentItem 属性 不起作用 strong> 即使您已将文件设置为 Content 并始终复制,这是因为您的 .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 个文件。注意目录“文件名”的尾部斜杠!

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

MsTest DeploymentItem OutputDirectory in testsettings

【讨论】:

以上是关于编写单元测试:如何以编程方式获取包含测试文件的文件夹的主要内容,如果未能解决你的问题,请参考以下文章

在单元测试中以编程方式执行 Unwind Segue

如何在 PHP 中编写文件上传测试?

您如何在 C# 中模拟文件系统以进行单元测试?

在单元测试静态库(不是应用程序)时编写日志文件?

您将如何以编程方式测试文件中的病毒? [关闭]

如何为以下代码段编写单元测试用例