2010-06-10 2 views
1

J'ai une classe pour crypter la connectionString.C# pourquoi le test unitaire a-t-il ce comportement étrange?

public class SKM 
     { 
      private string connStrName = "AndeDBEntities"; 

     internal void encryptConnStr() 
     { 
      if(isConnStrEncrypted()) 
       return; 
      ... 
     } 

     private bool isConnStrEncrypted() 
     { 
      bool status = false; 
      // Open app.config of executable. 
      System.Configuration.Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); 

      // Get the connection string from the app.config file. 
      string connStr = config.ConnectionStrings.ConnectionStrings[connStrName].ConnectionString; 

      status = !(connStr.Contains("provider")); 
      Log.logItem(LogType.DebugDevelopment, "isConnStrEncrypted", "SKM::isConnStrEncrypted()", "isConnStrEncrypted=" + status); 
      return status; 

     } 

    } 

Le code ci-dessus fonctionne correctement dans mon application. Mais pas dans mon projet de test unitaire.

Dans mon projet de test unitaire, je teste la méthode encryptConnStr(). il appellera la méthode isConnStrEncrypted(). Puis exception (pointeur NULL) sera lancée sur cette ligne:

string connStr = config.ConnectionStrings.ConnectionStrings[connStrName].ConnectionString; 

Je dois utiliser l'index comme celui-ci pour passer le test unitaire:

string connStr = config.ConnectionStrings.ConnectionStrings[0].ConnectionString; 

Je me souviens qu'il a travaillé il y a quelques jours au moment J'ai ajouté ci-dessus test unitaire. Mais maintenant, il me donne une erreur. Le test unitaire n'est pas encore intégré à notre construction automatique quotidienne. Nous avons seulement une connectionStr. Cela fonctionne avec le produit mais pas avec le test unitaire. Je ne sais pas pourquoi. Quelqu'un peut-il m'expliquer?

Répondre

1

Le projet de test unitaire utilise son propre fichier de configuration. La chaîne de connexion existe-t-elle également dans ce fichier?

0

config.ConnectionStrings essaie généralement de lire le fichier app/web.config du processus exécutant ce code. Vous devrez donc peut-être ajouter un fichier app.config contenant la chaîne de connexion dans votre projet de test unitaire.

0

Personnellement, je suggère de séparer votre méthode de test de cryptage en un IsStringEncrypted plus générique. De cette façon, vous pouvez tester la méthode de chiffrement sans avoir à vous soucier des bases de données, des chaînes de connexion ou du web/app.configs.

Dans votre code, vous appelez simplement

Chaîne connectionString = GetConnectionStringFromAppConfig(); SKM.IsStringEncrypted (connectionString);

Dans votre test unitaire, vous définissez simplement ce que connectionString serait pour ce test particulier.