2010-09-17 13 views
1

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 ... :)

+1

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. –

Répondre

3

répondre à ma propre question ici, mais je enfin compris cela:

mon Oracle.DataAc cess.dll finit dans mon dossier \ bin \ Debug quand VisualStudio le construit. Toutefois, lorsque MSTest.exe s'exécute, il ne copie pas ce fichier .dll dans le nouveau dossier où le test est réellement exécuté. Pour une raison quelconque, il copie les 30 autres fichiers, mais pas celui-là?

Quoi qu'il en soit, c'est pourquoi l'ajout du nom complet de l'assemblage a fonctionné; car alors il pourrait le charger à partir du GAC au lieu du dossier local.

+0

- Merci d'avoir répondu ainsi. J'ai complètement oublié d'inclure les DLL Oracle dont j'avais besoin dans la corbeille et c'était le rappel "vous factice" dont j'avais besoin. Je pense que je n'ai perdu que 3 heures à courir après celle-ci! LOL – Prethen

+0

Nous avons eu un problème similaire, sauf que notre problème était que nous avions 2 versions dans le gac et nous voulions l'ancienne version. il a continué à charger la dernière version. nous avons dû ajouter l'élément system.data au fichier de configuration de notre assembly de test NUnit (et pour faire bonne mesure le web.config). – JDPeckham

+0

Je rencontrais aussi ce problème, mais cela ne me concernait que sur notre serveur de build. Les optimisations du compilateur étaient à remercier. mstest reflète l'ensemble de test pour déterminer les assemblages à "déployer". Si vous souhaitez déployer une version spécifique avec votre test, vous pouvez ajouter une méthode et décorer avec [AssemblyInitialize]. là, mettez quelques références factices aux types dont vous avez besoin ... ie. var _ = typeof (System.Data.SqlServerCe.SqlCeEngine) _.GetMethods(); // ceci est requis pour empêcher les optimisations de publication de le compiler. –

0

je pouvais résoudre le problème en utilisant le code suivant:

[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; 
}