MSTest.exe не может загрузить ADO.NET Data провайдеров? - PullRequest
2 голосов
/ 17 сентября 2010

У меня действительно странная проблема с MSTest. У меня есть тест, который больше похож на интеграционный тест, и мне нужно подключиться к базе данных. Это достигается путем получения фабрики провайдера данных ADO.NET через вызов:

var factory = DbProviderFactories.GetFactory("Oracle.DataAccess.Client");

В моем файле app.config у меня есть:

<system.data>
  <DbProviderFactories>
    <add name="Oracle Data Provider" invariant="Oracle.DataAccess.Client" description=".Net Framework Data Provider for Oracle" type="Oracle.DataAccess.Client.OracleClientFactory, Oracle.DataAccess" />

Это прекрасно работает , и тест проходит, если я запускаю его в Visual Studio. Однако, если я открываю командную строку и запускаю ее с помощью MSTest.exe /testcontainer:..., тогда мой тест не пройден, за исключением:

System.Configuration.ConfigurationErrorsException
Message:  Failed to find or load the registered .Net Framework Data Provider.

Странно то, что если я запрашиваю классы DBProviderFacotry, я вижу своего провайдера "Oracle.DataAccess.Client", но при попытке получить экземпляр этого экземпляра возникает исключение:

var name = DbProviderFactories.GetFactoryClasses().Rows[1]["InvariantName"]; // returns "Oracle.DataAccess.Client"
var fact = DbProviderFactories.GetFactory("Oracle.DataAccess.Client"); // throws exception

Опять же, этот only завершается неудачно при запуске из командной строки MSTest.exe и отлично работает в VisualStudio 2008. У кого-нибудь есть идеи?


Обновление:

Я обнаружил еще одну интересную деталь ... В моем app.config я на самом деле очищаю коллекцию провайдеров перед добавлением записи oracle, потому что, если она уже существует в machine.config, это вызовет ошибки:

<system.data>
  <DbProviderFactories>
    <clear />
    <add name="Oracle Data Provider" invariant="Oracle.DataAccess.Client" description=".Net Framework Data Provider for Oracle" type="Oracle.DataAccess.Client.OracleClientFactory, Oracle.DataAccess" />

Теперь, я только что обнаружил, что если я полностью удаляю это из app.config и вообще не указываю DbProviderFactories, то он работает отлично!

Странно ...


Обновление 2

ОК, я думаю, что-то понял. В моем файле app.config, если я указываю полное / строгое имя для сборки, то оно работает как в VisualStudio, так и из командной строки:

<add name="Oracle Data Provider"
  invariant="Oracle.DataAccess.Client"
  description="Oracle Data Provider for .NET" 
  type="Oracle.DataAccess.Client.OracleClientFactory, Oracle.DataAccess, Version=2.111.7.20, Culture=neutral, PublicKeyToken=89b483f429c47342" />

Но короткое имя работает только в VisualStudio, а не в командной строке:

<add name="Oracle Data Provider"
  invariant="Oracle.DataAccess.Client"
  description=".Net Framework Data Provider for Oracle"
  type="Oracle.DataAccess.Client.OracleClientFactory, Oracle.DataAccess" />

Теперь мне просто хотелось бы понять, почему ...:)

Ответы [ 2 ]

3 голосов
/ 17 сентября 2010

Отвечая на мой собственный вопрос здесь, но я наконец понял это:

Мой Oracle.DataAccess.dll попадает в мою папку \ bin \ Debug, когда VisualStudio его создает. Однако при запуске MSTest.exe он не копирует этот DLL-файл в новую папку, в которой фактически выполняется тест. Почему-то копирует остальные 30 с лишним файлов, но не этот?

В любом случае, поэтому добавление полного имени сборки сработало; потому что тогда он мог бы загрузить его из GAC вместо локальной папки.

0 голосов
/ 05 января 2016

Я мог бы решить проблему, используя следующий код:

[ClassInitialize]
[AssemblyInitialize]
public static void InitTestSuite(TestContext testContext)
{
    // You use the capability for configuring the behavior of the EF-provider:
    var instanceSql = System.Data.Entity.SqlServer.SqlProviderServices.Instance;
    var instanceOracle = Oracle.ManagedDataAccess.EntityFramework.EFOracleProviderServices.Instance;
}
...