0

Resharper Ultimate 2016.1 で VS 2015 Update 2 を使用していますが、この奇妙な問題があります。

Model と Persistence の 2 つのプロジェクトを参照する Test というテスト プロジェクトがあります。モデル プロジェクトには nhibernate エンティティ クラスが含まれ、Persistence プロジェクトには *.hbm.xml ファイルが含まれます。これらは llblgenpro 4.2 で生成されました。nhibernate 4.0.4 を使用しています。

この呼び出しで NHibernate を初期化します。

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

テスト ケースの 1 つを実行すると、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 フォルダーにあります。

これはすべて、nhibernate 3.3.1 を使用する VS 2013 で正常に機能しました。また、テスト プロジェクト app.config ファイルの assemblybinding 要素を使用して、すべての dll バージョンを揃えました。

私のプロジェクトは .Net 4.6 をターゲットにしており、nunit 3.2.1 を使用しています。

私はこれを見つけました:

Resharper は別の場所から UnitTest を実行します

ただし、私の場合、「テスト中のシャドウ コピー アセンブリ」がオフになっています。テストを含むアセンブリごとに個別の 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 ライブラリを使用しています。NHibernateSession は、このライブラリに属する​​クラスです。

4

1 に答える 1

2

これはおそらく NUnit 3 での変更であり、現在のディレクトリがテスト中のアセンブリの場所に変更されなくなりました。これは、1 回のテスト実行で複数のアセンブリを実行できるためだと思います。どのディレクトリが最適でしょうか?

NUnit 3 Breaking Changes ドキュメントに従って、TestContext.CurrentContext.TestDirectoryテスト対象のアセンブリを含むディレクトリを見つけるために使用できます。

于 2016-04-26T13:47:10.387 に答える