2

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

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

由于这是在测试中,我不能依赖 HttpContext.Current.Server.MapPath() 或 Request.ApplicationPath 之类的东西,因为当测试运行时 Current 将为空。

没有编写一个 hack 来部署我需要动态加载到可能构建和运行应用程序的任何驱动器根目录上的特殊文件夹的 DLL,有没有人知道一个好的 .NET 策略来在运行时找到测试的物理路径?

我在 C# Web 应用程序中使用 NUnit,以及 Approval Test 样式断言,因此需要执行此操作的简单测试如下所示:

[Test]
public void ShouldGenerateFileConsistently()
{
    string pathToDll = FindRelativePathToDllBasedOnPhysicalPath(); // <-- what I need to figure out

    string generatedFileContents = OutputManager.GenerateReportUsingDynamicDll(pathToDll);

    Approvals.Verify(generatedFileContents);
}
4

1 回答 1

2
var codebase = Assembly.GetExecutingAssembly().CodeBase;
var pathUrlToDllDirectory = Path.GetDirectoryName(codebase);
var pathToDllDirectory = new Uri(pathUrlToDllDirectory).LocalPath;
于 2014-06-16T17:49:38.453 回答