NUnit运行多个程序集时Assembly.GetExecutingAssembly的意外位置

时间:2019-01-24 16:58:00

标签: c# reflection nunit

我最近在执行单元测试时遇到了一个奇怪的问题。我的解决方案包含一个帮助程序类,该类具有用于获取执行程序集目录的属性。看起来像这样:

public static class DirectoryHelper
{
    public static string ExecutingAssemblyDirectory
    {
        get
        {
            var codeBase = Assembly.GetExecutingAssembly().CodeBase;
            var uri = new UriBuilder(codeBase);
            var path = Uri.UnescapeDataString(uri.Path);
            return Path.GetDirectoryName(path);
        }
    }
}

通过各种测试类调用此方法,以获取依赖资源的相对文件路径。

以以下人为设计的项目为例:

TestProject1.dll-TestFixture1.cs

[TestFixture]
public class TestFixture1
{
    [Test]
    public void VerifyExecutingAssemblyDirectory1()
    {
        StringAssert.Contains(@"\TestProject1\bin\Debug", 
        DirectoryHelper.ExecutingAssemblyDirectory);
    }
}

TestProject2.dll-TestFixture2.cs

[TestFixture]
public class TestFixture2
{
    [Test]
    public void VerifyExecutingAssemblyDirectory1()
    {
        StringAssert.Contains(@"TestProject2\bin\Debug", 
        DirectoryHelper.ExecutingAssemblyDirectory);
    }
}

分别运行这些测试时,它们会通过,并且返回的程序集的位置是测试类的调试文件夹。

但是,当一起运行时,TestFixture2.VerifyExecutingAssemblyDirectory2()实际上将路径返回到TestProject1的bin文件夹,而不是TestProject2

我正在尝试确定为什么会发生这种行为,并了解解决此问题的更好方法。 我发现使用.GetCallingAssembly可以解决此问题,但是看来我不必这样做。

我创建了一个示例来重现此问题并将其发布到GitHub。 TylerNielsen/NUnitExecutingAssemblyExample

注意:我知道NUnit中的TestContext.TestDirectory,但是该库当前不依赖于NUnit,我希望保持这种状态。

更新 我正在通过Visual Studio中的Resharper和通过NUnit3-Console运行NUnit测试。当我使用NUnit3-Console运行时,我仅指定两个单独的.dll,而未提供任何其他参数。

1 个答案:

答案 0 :(得分:1)

TestProject1和TestProject2都引用了包含DirectoryHelper的程序集。我假设您的引用导致程序集被复制到单独的(单独的)输出目录。

同时运行两个测试程序集时,其中一个会导致加载该程序集的“个人”副本。第二个发现程序集已经在内存中。

当然,此行为将取决于您如何运行程序集,而您并未说明。如果您使用nunit3-console,它还取决于您的命令行参数,尤其是对于每个程序集是否使用单独的进程。