2009-09-23 4 views
2

Je stocke mes paramètres d'application dans mon fichier web.config et y accède à l'aide de ConfigurationManager.GetSection ou ConfigurationManager.AppSettings. J'ai créé un test pour m'assurer que les paramètres que je reçois de ma classe sont les paramètres corrects dans le fichier web.config, cependant, il retourne des valeurs nulles. Comment puis-je dire à mon test d'unité que la bibliothèque de classes doit utiliser le fichier web.config pour sa configuration plutôt que le fichier app.config qui accompagne la bibliothèque de classes? Dans ce cas, puisque je génère un test rapide, j'utilise la bibliothèque de test VS Unit intégrée.Test de la configuration Web à partir de la bibliothèque de classes

Répondre

0

j'ai pu ajouter le fichier app.config à l'application des tests pour obtenir mon problème résolu .

+0

En fait, même en modifiant mon app.config et en supprimant cette section, cela a fonctionné. Le problème sous-jacent était qu'un attribut échouait ailleurs dans le fichier web.config, donc cela ne fonctionnait pas. –

-2

Dans votre fichier app.config, vous pouvez ajouter le "fichier" attribut à votre élément appSettings:

< appsettings file = "d: \ mydir \ web.config">

Je suis Ce n'est pas une bonne pratique, mais votre app.config héritera des paramètres de votre web.config.

+0

J'ai essayé d'ajouter un fichier app.config à la bibliothèque de classes, en ajoutant dans ma section de configuration personnalisée, et en ajoutant l'attribut à la sectionGroup pour pointer vers le fichier web.config, cependant, il génère toujours des valeurs nulles. Lorsque l'application Web s'exécute, j'obtiens les résultats attendus. –

+0

ok. Ouais. l'attribut file ne fonctionne que pour appSettings et pas pour les autres sections personnalisées. –

+0

Pas de problème. D'autres idées? –

0

assez long, mais essayez ceci:

using System; 
using System.Configuration; 
using System.Web; 
using System.Web.Caching; 
using System.Xml; 
using System.Xml.Serialization; 

namespace Sol3.Configuration 
{ 
    //###################################################################################################################################################### 
    /// <summary> 
    /// This creates a configuration section handler letting the system know that any object with a 
    /// typeof(ClientConfiguration) can tie directly to the config file and section. 
    /// </summary> 
    public class ClientSetupSerializerSectionHandler : IConfigurationSectionHandler 
    { 
     public object Create(object parent, object configContext, System.Xml.XmlNode section) 
     { 
      XmlSerializer ser = new XmlSerializer(typeof(Sol3.Configuration.ClientSetupConfiguration)); 

      return ser.Deserialize(new XmlNodeReader(section)); 
     } 
    } 
    //###################################################################################################################################################### 
    /// <summary> 
    /// This is the concrete class that will handle the "ClientHandler" section in the web.config. 
    /// </summary> 
    [Serializable()] 
    [XmlRoot("BasicSetup")] 
    public class ClientSetupConfiguration 
    { 
     #region Properties 
     [XmlElement("HomePageRedirect")] public string HomePageRedirect; 
     [XmlElement("ServicesRootUrl")] public string ServicesRootUrl; 
     [XmlElement("CookieDomain")] public string CookieDomain; 
     [XmlElement("AllowScriptAccess")] public string AllowScriptAccess; 
... 
     [XmlElement] public string Info_Server; 
     [XmlElement] public string Info_Database; 
     #endregion 

     #region Static Methods 
     public static ClientSetupConfiguration GetSetupConfig() 
     { 
      if (HttpContext.Current.Cache["ClientSetupConfiguration"] == null) 
       HttpContext.Current.Cache.Insert("ClientSetupConfiguration", ConfigurationManager.GetSection("BasicSetup")); 

      return (Sol3.Configuration.ClientSetupConfiguration)HttpContext.Current.Cache["ClientSetupConfiguration"]; 
     } 
     #endregion 
    } 
} 

Je puis créé une classe "aide" qui ressemble à ceci:

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.IO; 

namespace Sol3 { 
    static class AppSettings 
    { 
     public static string Info_Server { get { return Sol3.Configuration.ClientSetupConfiguration.GetSetupConfig().Info_Server; } } 
     public static string Info_Database { get { return Sol3.Configuration.ClientSetupConfiguration.GetSetupConfig().Info_Database; } } 
... 
     static public bool inProduction { get { return Info_Server.ToLower().Contains("rackspace"); } } 

    } 
} 

Maintenant, où que vous soyez dans le code que je peux appeler Sol3.AppSettings. Info_Server et il obtient cette information à partir du web.config.

Tout cela est fait dans un projet de DLL et a travaillé pour nous pendant un certain temps maintenant. Le GetSetupConfig() est la clé car cela est la façon dont il sait obtenir le fichier web.config ...

HTH

+0

Eh bien, mon code fonctionne, mais lors du test, le projet de test ne sait pas quel fichier de configuration utiliser. Comment cela est-il connu avant l'exécution pour tirer du web.config? –

+0

Hmm, bonne question. Je n'ai pas essayé ce code dans cette situation. Vous pouvez voir s'il y a quelque chose dans mon blog sur l'utilisation de plusieurs configurations - http://sol3.net/blogs/starpilot/archive/2008/04/21/using-multiple-config-files-in-one-application. aspx. –

Questions connexes