J'ai un problème vraiment étrange avec MSTest. J'ai un test qui est plus d'un test d'intégration, et doit se connecter à la base de données. Elle le fait en obtenant l'usine de fournisseur de données ADO.NET via un appel à:MSTest.exe impossible de charger les fournisseurs de données ADO.NET?
var factory = DbProviderFactories.GetFactory("Oracle.DataAccess.Client");
Dans mon fichier app.config, j'ai:
<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" />
Ce fonctionne parfaitement bien et le test passe si je l'exécute dans Visual Studio. Cependant, si j'ouvre une invite de commande, et l'exécuter en utilisant MSTest.exe /testcontainer:...
Ensuite mon test échoue, à l'exception:
System.Configuration.ConfigurationErrorsException
Message: Failed to find or load the registered .Net Framework Data Provider.
La chose étrange est que si je fais une recherche des classes DBProviderFacotry, je ne vois mon « Oracle.DataAccess fournisseur .Client », mais en essayant d'obtenir effectivement une instance de celui-ci lance une exception:
var name = DbProviderFactories.GetFactoryClasses().Rows[1]["InvariantName"]; // returns "Oracle.DataAccess.Client"
var fact = DbProviderFactories.GetFactory("Oracle.DataAccess.Client"); // throws exception
Encore une fois, ce ne échoue lorsqu'il est exécuté à partir de la ligne de commande MSTest.exe, et fonctionne très bien dans VisualStudio 2008. Toute personne avoir des idées?
Mise à jour:
J'ai trouvé un autre détail intéressant ... Dans mon app.config, je fais en fait une vision claire de la collection du fournisseur avant d'ajouter mon entrée oracle, parce que si elle existait déjà dans machine.config, il causerait des erreurs:
<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" />
maintenant, ce que je viens de découvrir que si je retire complètement cela du app.config, et ne précise pas les DbProviderFactories du tout, il fonctionne très bien !
... Etrange
Mise à jour 2
OK, je suppose que je sorte de compris cela. Dans mon app.config, si je spécifie le nom complet/strong pour l'assemblage, il fonctionne, dans les deux VisualStudio et de la ligne de commande:
<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" />
Mais le nom court ne fonctionne que dans VisualStudio, pas la ligne de commande:
<add name="Oracle Data Provider"
invariant="Oracle.DataAccess.Client"
description=".Net Framework Data Provider for Oracle"
type="Oracle.DataAccess.Client.OracleClientFactory, Oracle.DataAccess" />
maintenant, je souhaite juste que je compris pourquoi ... :)
j'ai rencontré des problèmes similaires avec SQLite lors de tests unitaires MSTest. Je n'avais pas de fichier app.config, ce que je finissais par ajouter consistait à ajouter des attributs [DeploymentItem] aux tests concernés pour m'assurer que les DLL étaient déployées, ce qui semble avoir résolu mes problèmes. –