如何在运行时找到C#.NET集成测试中的物理路径?

How to find physical path inside of a C# .NET integration test at runtime?

本问题已经有最佳答案,请猛点这里访问。

为了围绕基于某些输入构建详细文件的旧遗留过程包装集成测试,我需要通过提供文件的完整路径动态加载DLL。

此测试将在许多不同的开发人员的计算机上运行,这些计算机并不总是共享相同的物理应用程序目录,但也将在许多服务器上运行,因为它通过一个连续的集成过程,有时应用程序的多个实例将在同一物理机上运行。关键是,没有标准路径可以依赖于硬编码到这个测试中。我真正需要的是一种机制,它可以告诉我测试执行时所使用的物理路径,然后我可以使用该路径中的相对路径在应用程序的安装中始终可靠地找到DLL。

因为这是在测试中,所以我不能依赖httpContext.current.server.mapPath()或request.applicationPath之类的东西,因为测试运行时current将为空。

除了编写一个用于部署dll的黑客程序,我还需要动态加载到任何可能构建和运行应用程序的驱动器根目录上的一个特殊文件夹中,是否有人知道在运行时查找测试物理路径的良好.NET策略?

我在C Web应用程序中使用了nunit,以及批准测试样式断言,因此需要执行的简单测试如下所示:

1
2
3
4
5
6
7
8
9
[Test]
public void ShouldGenerateFileConsistently()
{
    string pathToDll = FindRelativePathToDllBasedOnPhysicalPath(); // <-- what I need to figure out

    string generatedFileContents = OutputManager.GenerateReportUsingDynamicDll(pathToDll);

    Approvals.Verify(generatedFileContents);
}


1
2
3
var codebase = Assembly.GetExecutingAssembly().CodeBase;
var pathUrlToDllDirectory = Path.GetDirectoryName(codebase);
var pathToDllDirectory = new Uri(pathUrlToDllDirectory).LocalPath;