在单元测试期间获取引用项目的路径

Posted

技术标签:

【中文标题】在单元测试期间获取引用项目的路径【英文标题】:Get path of referenced project during unit testing 【发布时间】:2013-06-23 05:22:26 【问题描述】:

我正在尝试使用单元测试在我的 (ASP.Net) Web 应用程序中测试一个类的功能。此类从硬盘驱动器加载一些文件(以执行 xsl 转换):

Xsl = GetXSLFromFile(AppDomain.CurrentDomain.BaseDirectory + "\XML Transformationen\Transformation_01.xslt")

此路径在 Web 应用程序本身的调试过程中被正确解析。但是每当我开始单元测试(它驻留在一个单独的测试项目中,引用 Web 应用程序的项目)时,我都会得到测试项目的路径。

在这种情况下是否可以获取 Web 应用程序的路径,还是我必须使用不同的方法? 任何提示表示赞赏。

【问题讨论】:

【参考方案1】:

我建议你这样做:

public class MyXslFileLoader

    public void Load()
    
        Load(AppDomain.CurrentDomain.BaseDirectory + "\XML Transformationen\Transformation_01.xslt");
    

    public void Load(string path)
    
        Xsl = GetXSLFromFile(path);
    

您可以在 Web 应用程序中调用 Load(),但在您的单元测试应用程序中使用此方法的重载版本。您可以考虑将 xslt 文件作为资源添加到您的项目中。

你可以像这样加载路径:

var webApplicationDllPath = Path.GetDirectoryName(typeof(ClassInTheWebApplicationDll).Assembly.GetName().CodeBase);

【讨论】:

是的,这可能是可行的。唯一的缺点是,我必须在每个父方法中使用路径参数。也许我必须重新考虑我的类实例化,并提供通过构造函数的路径。 这有什么缺点吗?您可以使基类包含方法重载并在那里实现它们。此外,理论上Path.GetDirectoryName 的例子就足够了 Path.GetDirectoryName 示例也返回测试项目的路径。我的意思是,从测试项目中的调用到在 web 应用程序中加载文件的方法,调用堆栈中的每个方法都必须获取该参数。类似于 class.LoadXsl(path) -> class.LoadXsl2(path) -> class.Load(path) . 该类位于 webapplication 项目中。但是因为测试项目引用了这个项目,所以将webapplication的dll复制到了测试项目的debug文件夹中。我认为,在这种情况下,在运行时获取 Web 应用程序的路径可能是不可能的。【参考方案2】:
string path;
path = System.IO.Path.GetDirectoryName( 
  System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase );

HOW TO: Determine the Executing Application's Path

Getting the path of a executable file in C#

希望这有帮助.. :)

【讨论】:

正在执行的程序集将是 unittest 项目。你会走错路。 嗨。它通常很有帮助,因为它给出了实际执行程序集的路径。 :) 但在我的情况下,它还返回测试项目的子文件夹。我需要的是类所在的路径之类的。【参考方案3】:

好的,这给出了提示:Can a unit test project load the target application's app.config file?

在 .testsettings 文件中,由测试项目添加到我的 web 应用程序项目中,我可以添加文件和文件夹,每次执行测试时应将其复制到测试项目调试文件夹中。

所以在此之后我可以引用每个 AppDomain.CurrentDomain.BaseDirectory 的 xsl 文件。

此外,为了保持文件夹结构,我必须执行此处描述的操作: Visual Studio Test Project - Does not copy folder on deployment

我必须使用文本编辑器编辑 .testsettings 文件,并添加 outputDirectory 参数。之后我重新启动了 Visual Studio,并在启动测试项目时正确复制了文件夹和文件。

【讨论】:

以上是关于在单元测试期间获取引用项目的路径的主要内容,如果未能解决你的问题,请参考以下文章

没有为此解决方案配置选中要生成的项目

如何在单元测试期间访问 .war 类路径中的文件?

在Symfony单元测试期间无法获取用户名

在 Unity3d 的 Unity Test Runner 中的单元测试期间加载文件

fileManager.createFileAtPath 在单元测试期间失败

在单元测试期间填充 Spring @Value