2016-05-04 1 views
3

Я работаю над этой конкретной проблемой в течение пары недель, и я очень расстроен. Таким образом, я дам всю информацию, которую я могу, и надеюсь на лучшее.nHibernate, не создающий драйвер Oracle в MSTests, запущен в командной строке

Моя команда работает над созданием нового приложения. Вот алфавитный суп:

  • .Net 4.5.1
  • NHibernate 4.0.0.4000 с FluentNHibernate 2.0.3.0
  • Oracle 11g (Oracle.DataAccess 2.112.1.0, который имеет Copy Local значение ИСТИНА)
  • Visual Studio 2013 является IDE
  • Windows 7 Professional

Я компиляции приложения, как 32-битного приложения на, и я подтвердил, что у меня есть 3 Установлена ​​2-битная версия Oracle.

Мы написали несколько тестов для сопоставлений NHibernate, которые мы запускаем через MSTest. Когда мы запускаем их через тестовый проводник Visual Studio, все они работают нормально и проходят. Само приложение также правильно компилируется и развертывается, как должно. Мы проверили, что тесты работают правильно, проверяя базу данных между шагами, поэтому мы достаточно уверены, что сами тесты не являются проблемой.

Когда мы запускаем MSTest через командную строку, хотя, мы получаем следующую ошибку:

Initialization method MyTests.Setup threw exception. NHibernate.HibernateException: NHibernate.HibernateException: Could not create the driver from NHibernate.Driver.OracleDataClientDriver. ---> System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.ArgumentException: Unable to find the requested .Net Framework Data Provider. It may not be installed..

Я пытался переустановить Oracle никакого эффекта. Я попытался проверить файл machine.config на наличие ошибок (как это было предложено в других сообщениях здесь на SO) и не нашел ни одного.

Наша Fluent конфигурация выглядит следующим образом:

OracleDataClientConfiguration.Oracle10 
    .ConnectionString(connectionString) 
    .Driver("NHibernate.Driver.OracleDataClientDriver") 
    .ShowSql() 
    .FormatSql(); 

код я бегу на командной строке следующее:

(cd to the directory where the test .dll is) 
>"C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\MSTest.exe" /testcontainer:MyTests.dll /test:UnitTests 

Я чувствую, что я пропускаю что-то здесь. Есть идеи?


Обновление: Решение найдено

Так вот странно один. Я последовал за решением Франса ниже и установил пакет Oracle.ManagedDataAccess и изменил драйвер NHibernate в нашей конфигурации выше в NHibernate.Driver.OracleManagedDataClientDriver. Согласно нашей быстрой комментарию-дискуссии, это приведет к новой ошибке:

Initialization method MyTests.Setup threw exception. NHibernate.HibernateException: NHibernate.HibernateException: Could not create the driver from NHibernate.Driver.OracleManagedDataClientDriver. ---> System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.Configuration.ConfigurationErrorsException: Failed to find or load the registered .Net Framework Data Provider

Fran затем привести меня к another SO question, который поощрял меня, чтобы проверить конфигурацию часть Oracle по частям. Какой лучший способ сделать это, чем создать тест?

var x = new OracleConnection(connectionString); 
x.Open(); 
Assert.IsTrue(x.State == System.Data.ConnectionState.Open); 
x.Close(); 
Assert.IsFalse(x.State == System.Data.ConnectionState.Open); 

В моей быстрой попытке запустить этот тест, я запустил целую коллекцию UnitTests со сценарием я упомянутым выше. Низкий и вот, каждый тест проходит! Делая свою должную осмотрительность, попробуйте следующее

  • Я закомментировать этот тест, чистый, восстановить и запустить скрипт. Неудачи.
  • Я возвращаюсь к старому драйверу Oracle и добавляю этот новый тест. Чистота, перестройка, запуск. Неудачи.
  • Добавьте новый драйвер Oracle, убедитесь, что новый тест все еще включен. Запустите тесты OTHER, чем новый тест. Пропуска.

По какой-то причине комбинация нового драйвера и явно ссылка на него в тесте, похоже, решила проблему. Я открыт для любых теорий о том, почему, но я уверен, что это новый вопрос.

+0

Привет, спасибо, это мне очень помогает. На самом деле тестовые решения не ведут себя как обычный проект. В этом случае для включения DLL мы должны использовать. Например: Console.Write (typeof (OracleConnection)); будет делать вывод sams –

ответ

2

Я бы прекратил использовать бит версии драйверов oracle и перешел к управляемому драйверу (https://www.nuget.org/packages/Oracle.ManagedDataAccess/). Он не является агностиком и не требует установки клиента Oracle вообще.

+0

Я попытался это и получил следующую новую ошибку: «Метод инициализации MyTests.Setup сделал исключение. NHibernate.HibernateException: NHibernate.HibernateException: Не удалось создать драйвер из NHibernate.Driver.OracleManagedDataClientDriver. ---> System.Reflection.TargetInvocationException: Исключение было выбрано целью вызова. ---> System.Configuration.ConfigurationErrorsException: Не удалось найти или загрузить зарегистрированного поставщика данных .Net Framework. Я также обязательно изменил настроенный драйвер для Oracle.ManagedDataClientDriver – WadeB

+0

. У вас есть тестовый проект с app.config, который отображает приложение? .config или web.config проекта, который вы тестируете? – Fran

+0

Это действительно так. Все, что я считаю соответствующими областями, одинаково. Вы ожидаете определенного несоответствия? – WadeB

1

Я действительно нашел решение проблемы, и все это связано с тем, как файл загрузки Oracle.DataAccess.dll загружается во время выполнения (раскрытие: я работаю с wadeb в том же проекте).

Кажется, что Oracle.DataAccess.dll был разыскиваются в любом месте на сервере кроме выходной папки сборки в рабочем Дженкинс, и как таковые тянул файл DLL из GAC.

Одним из путей к файлу, используемым для поиска DLL-файла, является папка, в которой находится «текущий исполняемый файл». В нашем случае «текущий исполняемый файл» был mstest.exe. Копирование файла Oracle.DataAccess.dll в C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE сделал трюк.

Это работало. Да.

Был ли это взлом? Абсолютно - но теперь он работает без необходимости обновления до управляемых драйверов Oracle.

На наших серверах не использовался клиент Oracle, который работал с управляемым драйвером, и было недопустимо иметь сломанную непрерывную интеграционную сборку до тех пор, пока серверы не будут обновлены.