我最近在执行单元测试时遇到了一个奇怪的问题。我的解决方案包含一个帮助程序类,该类具有用于获取执行程序集目录的属性。看起来像这样:
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,而未提供任何其他参数。
答案 0 :(得分:1)
TestProject1和TestProject2都引用了包含DirectoryHelper的程序集。我假设您的引用导致程序集被复制到单独的(单独的)输出目录。
同时运行两个测试程序集时,其中一个会导致加载该程序集的“个人”副本。第二个发现程序集已经在内存中。
当然,此行为将取决于您如何运行程序集,而您并未说明。如果您使用nunit3-console,它还取决于您的命令行参数,尤其是对于每个程序集是否使用单独的进程。