У меня действительно странная проблема с 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" />
Теперь мне просто хотелось бы понять, почему ...:)