0

Я использую VS 2015 Update 2 с Resharper Ultimate 2016.1, и у меня есть эта странная проблема.Assembly.LoadFrom не загружает dll из bin debug при выполнении модульных тестов с помощью resharper

У меня есть тестовый проект Test, который ссылается на два проекта: Модель и Стойкость. Модельный проект содержит классы nhibernate entity, а проект 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. Кроме того, я получил все версии dll для выравнивания с помощью элементов сборщика в файле app.config тестового проекта.

Мои проекты целевые .Net 4.6 и я использую nunit 3.2.1.

Я нашел это:

Resharper runs UnitTest from different location

Однако в моем случае «Теневая копия сборка тестируется» выключен, используйте отдельный AppDomain для каждой сборки с тестами также отключаются. Run Tests from установлен в папку вывода Project.

Любые идеи, что может вызвать это?

Благодаря

Обновление: Если я это делать это работает:

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

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

Update 2. Мой проект использует Sharp Architecture library. NHibernateSession - это класс, который принадлежит этой библиотеке.

+0

Что такое 'NHibernateSession'? Это не выглядит как родная часть NHibernate. Если это какой-то пользовательский класс, вам сложно помочь, не имея его кода. Возможно, это какой-то класс, созданный llblgenpro: в таком случае было бы лучше попросить их о поддержке. –

+0

И, возможно, вам будет проще оставить в стороне llblgenpro и работать непосредственно с вашими картами и сессионной фабрикой. Это позволит вам точно настроить их на нужды вашего бизнеса. (Вы можете прочитать больше о моем представлении [здесь] (/ a/35589532/1178314).) И у вас будет больше возможностей для обработки инициализации фабрики сеансов, например, в моем ответе [здесь] (/ a/35711701/1178314). –

+0

@ Frédéric: Я обновил свой пост. Этот NHibernateSession принадлежит библиотеке s # arp-architecture.Извините, я пропустил это. – costa

ответ

2

Это, скорее всего, изменение в NUnit 3, которое больше не изменяет текущий каталог на местоположение тестируемой сборки. Я считаю, что это связано с тем, что он может запускать несколько сборок в одном тестовом прогоне - так какой каталог лучше всего?

Согласно the NUnit 3 Breaking Changes document, вы можете использовать TestContext.CurrentContext.TestDirectory, чтобы найти каталог, содержащий тестируемую сборку.

+0

Я переключился на NUnit 2.6.4, и он отлично работает как есть. Так и должно быть. – costa

 Смежные вопросы

  • Нет связанных вопросов^_^