当 运行 使用 resharper 进行单元测试时,Assembly.LoadFrom 不会从 bin\debug 加载 dll

Assembly.LoadFrom doesn't load dll from bin\debug when running unit tests with resharper

我在使用 VS 2015 Update 2 和 Resharper Ultimate 2016.1 时遇到了这个奇怪的问题。

我有一个名为 Test 的测试项目,它引用了两个项目,Model 和 Persistence。模型项目包含 nhibernate 实体 classes,Persistence 项目包含 *.hbm.xml 文件。它们是用 llblgenpro 4.2 生成的。我正在使用 nhibernate 4.0.4.

我用这个调用初始化 NHibernate:

  NHibernateSession.Init(
    new SimpleSessionStorage(), 
    new string[] { "Persistence.dll", "Model.dll" });

当我 运行 我的一个测试用例时,nhibernate 初始化失败并出现以下异常:

System.IO.FileNotFoundException was unhandled by user code
  FileName=file:///C:\Users\costa\AppData\Local\JetBrains\Installations\ReSharperPlatformVs14\Persistence.dll
  FusionLog==== Pre-bind state information ===
LOG: Where-ref bind. Location = C:\Users\costa\AppData\Local\JetBrains\Installations\ReSharperPlatformVs14\Persistence.dll
LOG: Appbase = file:///C:/projects/csharp/Test/bin/Debug
LOG: Initial PrivatePath = NULL
Calling assembly : (Unknown).
===
LOG: This bind starts in LoadFrom load context.
WRN: Native image will not be probed in LoadFrom context. Native image will only be probed in default load context, like with Assembly.Load().
LOG: Using application configuration file: C:\Users\costa\AppData\Local\Temp\s0hjyhsk.jq1\a3514fde-acb9-4c62-a0ce-a586f8202f35.config
LOG: Using host configuration file: 
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework64\v4.0.30319\config\machine.config.
LOG: Attempting download of new URL file:///C:/Users/costa/AppData/Local/JetBrains/Installations/ReSharperPlatformVs14/Persistence.dll.

  HResult=-2147024894
  Message=Could not load file or assembly 'file:///C:\Users\costa\AppData\Local\JetBrains\Installations\ReSharperPlatformVs14\Persistence.dll' or one of its dependencies. The system cannot find the file specified.
  Source=mscorlib
  StackTrace:
       at System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)
       at System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef, Evidence assemblySecurity, RuntimeAssembly reqAssembly, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)
       at System.Reflection.RuntimeAssembly.InternalLoadFrom(String assemblyFile, Evidence securityEvidence, Byte[] hashValue, AssemblyHashAlgorithm hashAlgorithm, Boolean forIntrospection, Boolean suppressSecurityChecks, StackCrawlMark& stackMark)
       at System.Reflection.Assembly.LoadFrom(String assemblyFile)
       at SharpArch.NHibernate.NHibernateSession.<>c__DisplayClass36_0.<CreateSessionFactoryFor>b__0(MappingConfiguration m) in C:\work\sharp-arch\Solutions\SharpArch.NHibernate\NHibernateSession.cs:line 412
       at FluentNHibernate.Cfg.FluentConfiguration.BuildConfiguration()
  InnerException: 

如果我将 persistence.dll 复制到 C:\Users\costa\AppData\Local\JetBrains\Installations\ReSharperPlatformVs14 文件夹,测试用例工作正常。 persistence.dll在C:/projects/csharp/Test/bin/Debug文件夹中,因为测试项目中引用了持久化项目

这在 VS 2013 和 nhibernate 3.3.1 中都运行良好。我还使用测试项目 app.config 文件中的程序集绑定元素使所有 dll 版本对齐。

我的项目以 .Net 4.6 为目标,我使用 nunit 3.2.1。

我发现了这个:

Resharper runs UnitTest from different location

但是,在我的情况下 'Shadow-copy assemblies being tested' 已关闭,对每个带测试的程序集使用单独的 AppDomain 也已关闭。 运行 测试来自设置为项目输出文件夹。

知道是什么原因造成的吗?

谢谢

更新:如果我这样做,它会起作用:

  string path = Assembly.GetExecutingAssembly().Location;
  string directory = Path.GetDirectoryName(path);

  NHibernateSession.Init(
    new SimpleSessionStorage(), 
    new string[] { directory + "\Persistence.dll", directory + "\Model.dll" });

更新2。我的项目使用了Sharp Architecture library。 NHibernateSession 是一个属于这个库的 class。

这可能是 NUnit 3 中的一个更改,它不再将当前目录更改为被测程序集的位置。我相信这是因为它可以在一次测试中 运行 多个程序集 运行 - 那么哪个目录最好?

根据 the NUnit 3 Breaking Changes document,您可以使用 TestContext.CurrentContext.TestDirectory 找到包含被测程序集的目录。