NUnit 运行多个程序集时 Assembly.GetExecutingAssembly 的意外位置
Unexpected Location of Assembly.GetExecutingAssembly When NUnit Runs Multiple Assemblies
我最近在执行单元测试时遇到了一个奇怪的问题。我的解决方案包含一个助手 class 和一个 属性 用于获取执行程序集的目录。它看起来像这样:
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);
}
}
}
通过各种测试调用此方法 classes 以获取依赖资源的相对文件路径。
以以下做作的项目为例:
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);
}
}
当这些测试单独 运行 时,它们会通过并且返回的程序集的位置是测试的调试文件夹 class。
然而,当 运行 在一起时,TestFixture2.VerifyExecutingAssemblyDirectory2() 实际上返回的是 TestProject1
的 bin 文件夹的路径,而不是 TestProject2
.
我正在尝试确定为什么会出现这种行为并了解解决此问题的更好方法。
我发现使用 .GetCallingAssembly
可以解决这个问题,但我似乎不必这样做。
我创建了一个示例来重现此问题并发布到 GitHub。 TylerNielsen/NUnitExecutingAssemblyExample
注意:我知道 NUnit 中的 TestContext.TestDirectory
,但是该库目前不依赖于 NUnit,我希望保持这种状态。
更新
我正在 运行 通过 Visual Studio 中的 Resharper 和 NUnit3-Console 进行 NUnit 测试。当我 运行 使用 NUnit3-Console 时,我只指定了两个单独的 .dll,而不提供任何其他参数。
TestProject1 和 TestProject2 都引用了包含 DirectoryHelper 的程序集。我假设您的引用导致程序集被复制到单独的(单独的)输出目录。
当您 运行 同时测试两个程序集时,其中一个程序集会导致加载该程序集的 "personal" 副本。第二个发现程序集已经在内存中了
当然,此行为将取决于您如何 运行 程序集,您没有说。在你使用 nunit3-console 的情况下,它还取决于你的命令行参数,特别是你是否为每个程序集使用单独的进程。
我最近在执行单元测试时遇到了一个奇怪的问题。我的解决方案包含一个助手 class 和一个 属性 用于获取执行程序集的目录。它看起来像这样:
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);
}
}
}
通过各种测试调用此方法 classes 以获取依赖资源的相对文件路径。
以以下做作的项目为例:
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);
}
}
当这些测试单独 运行 时,它们会通过并且返回的程序集的位置是测试的调试文件夹 class。
然而,当 运行 在一起时,TestFixture2.VerifyExecutingAssemblyDirectory2() 实际上返回的是 TestProject1
的 bin 文件夹的路径,而不是 TestProject2
.
我正在尝试确定为什么会出现这种行为并了解解决此问题的更好方法。
我发现使用 .GetCallingAssembly
可以解决这个问题,但我似乎不必这样做。
我创建了一个示例来重现此问题并发布到 GitHub。 TylerNielsen/NUnitExecutingAssemblyExample
注意:我知道 NUnit 中的 TestContext.TestDirectory
,但是该库目前不依赖于 NUnit,我希望保持这种状态。
更新 我正在 运行 通过 Visual Studio 中的 Resharper 和 NUnit3-Console 进行 NUnit 测试。当我 运行 使用 NUnit3-Console 时,我只指定了两个单独的 .dll,而不提供任何其他参数。
TestProject1 和 TestProject2 都引用了包含 DirectoryHelper 的程序集。我假设您的引用导致程序集被复制到单独的(单独的)输出目录。
当您 运行 同时测试两个程序集时,其中一个程序集会导致加载该程序集的 "personal" 副本。第二个发现程序集已经在内存中了
当然,此行为将取决于您如何 运行 程序集,您没有说。在你使用 nunit3-console 的情况下,它还取决于你的命令行参数,特别是你是否为每个程序集使用单独的进程。