2010-11-05 12 views
12

mam następujace testy:Jak czytać app.config unittest projektu, z testu z HostType („Moles”)

[TestClass] 
public class GeneralTest 
{ 
    [TestMethod] 
    public void VerifyAppDomainHasConfigurationSettings() 
    { 
     string value = ConfigurationManager.AppSettings["TestValue"]; 
     Assert.IsFalse(String.IsNullOrEmpty(value), "No App.Config found."); 
    } 

    [TestMethod] 
    [HostType("Moles")] 
    public void VerifyAppDomainHasConfigurationSettingsMoles() 
    { 
     string value = ConfigurationManager.AppSettings["TestValue"]; 
     Assert.IsFalse(String.IsNullOrEmpty(value), "No App.Config found."); 
    } 
} 

Jedyną różnicą między nimi jest [HostType("Moles")]. Ale pierwsze przechodzi, a drugie zawiedzie. Jak mogę odczytać App.config z drugiego testu?

A może mogę dodać inny plik konfiguracyjny w innym miejscu?

+0

Wielki obejście został złożony do mojego podobnym pytaniem: http://stackoverflow.com/questions/9117248/cant-access-information-from-configuration-files-when-tests-have-host-type -mol –

+0

Znalazłem tę odpowiedź: http://stackoverflow.com/a/6151688/13390, aby być najlepszym sposobem na zmianę pliku konfiguracyjnego podczas używania moli. Działa to pięknie, jeśli używasz niestandardowych sekcji konfiguracji (w rzeczywistości to jedyny, który działał w tym przypadku). –

Odpowiedz

6

Zobacz http://social.msdn.microsoft.com/Forums/en/pex/thread/9b4b9ec5-582c-41e8-8b9c-1bb9457ba3f6

W tym czasie, jako dzieło wokół, można spróbować dodać ustawień konfiguracyjnych Microsoft.Moles.VsHost.x86.exe.config

+3

Zgodnie z linkiem jest to błąd, nad którym trwają prace. Tak, żeby ppl nie musiała tam iść i czytać nici. – jcollum

+0

To naprawdę jest do bani. Mamy kilka testów integracyjnych, gdzie (na lepsze lub na gorsze) testowanie app.config jest dość duże. Utknąłem reimplementing ConfigurationManager/WebConfigurationManager. – BFree

5
[ClassInitialize] 
    public static void MyClassInitialize(TestContext testContext) 
    { 
     System.Configuration.Moles.MConfigurationManager.GetSectionString = 
      (string configurationName) => 
       { 
        ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap(); 
        Assembly assembly = Assembly.GetExecutingAssembly(); 
        fileMap.ExeConfigFilename = assembly.Location + ".config"; 
        Configuration config = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None); 
        object section = config.GetSection(configurationName); 
        if (section is DefaultSection) 
        { 
         ConfigurationSection configurationSection = (ConfigurationSection) section; 
         Type sectionType = Type.GetType(configurationSection.SectionInformation.Type); 
         if (sectionType != null) 
         { 
          IConfigurationSectionHandler sectionHandler = 
           (IConfigurationSectionHandler)AppDomain.CurrentDomain.CreateInstanceAndUnwrap(sectionType.Assembly.FullName, sectionType.FullName); 
          section = 
           sectionHandler.Create(
            configurationSection.SectionInformation.GetParentSection(), 
            null, 
            XElement.Parse(configurationSection.SectionInformation.GetRawXml()).ToXmlNode()); 
         } 
        } 

        return section; 
       }; 
    } 
+1

Wygląda obiecująco na tę próbę programu ConfigurationManager, ale jeśli użyję tego, aby uzyskać ustawienie aplikacji, pojawia się następujący błąd: "System.Configuration.ConfigurationErrorsException: sekcja konfiguracji" appSettings "ma nieoczekiwaną deklarację". Jakieś poprawki w tym? – Dennis

+0

@Dennis, aby obejść ten błąd, zobacz przykładowy kod tutaj: http://social.msdn.microsoft.com/Forums/is/pex/thread/9b4b9ec5-582c-41e8-8b9c-1bb9457ba3f6 Jeśli nie nie ma żadnych niestandardowych ustawień aplikacji, możesz po prostu "zwrócić nową NameValueCollection();" –

2

natknąłem to problem w pracy i nie podobały mu się żadne z tych odpowiedzi. Mam także problem, że plik konfiguracyjny jest odczytywany w statycznym konstruktorze, co oznacza, że ​​nie mogę Mole ConfigurationManager przed wykonaniem statycznego konstruktora.

Próbowałem tego na moim komputerze domowym i stwierdziłem, że plik konfiguracyjny został odczytany poprawnie. Okazuje się, że używałem Pex 0.94.51006.1 w domu. Jest nieco starszy niż obecny. Udało mi się znaleźć wersję do pobrania dla starszej wersji akademickiej: http://research.microsoft.com/en-us/downloads/d2279651-851f-4d7a-bf05-16fd7eb26559/default.aspx

Zainstalowałem to na moim komputerze roboczym i wszystko działa idealnie. W tym momencie obniżam do starszej wersji, dopóki nie zostanie wydana nowsza działająca wersja.

+0

Witamy w przepełnieniu stosu. To jest strona z pytaniami i odpowiedziami, a nie typowe forum, więc umieszczenie pytania jako części twojej odpowiedzi nie przyniesie mu należytej uwagi ani nie będzie odpowiednie dla witryny, ponieważ odpowiedź na pytanie ma tylko odpowiedzieć na to pytanie . Normalnie radziłbym, aby zadać pytanie osobno, ale pytanie o to, czy narzędzie jest wciąż rozwijane, jest tutaj poza tematem. Jest to pytanie najlepiej adresowane do programistów tego narzędzia. Dzięki. –

17

Zakładając, że próbujesz uzyskać dostęp do wartości w appSettings, możesz po prostu dodać konfigurację na początku testu. Coś jak:

ConfigurationManager.AppSettings["Key"] = "Value"; 

Następnie, gdy twój test spróbuje odczytać "Klucz" aplikacji, zwrócony zostanie "Wartość".

+0

O mój. Gdyby to zależało ode mnie, uczyniłbym to zaakceptowaną odpowiedzią !!! Dziękuję bardzo. To jest jakaś chwila. lolz – pqsk

+3

Po prostu chciałem dodać do każdego zainteresowanego dodanie łańcucha połączenia trochę się różni: ConfigurationManager.ConnectionStrings.Add (new ConnectionStringSettings ("name", "connectionstring"); – pqsk

+0

Dzięki, Kipp :) –

0

To co używam, aby uzyskać prawidłowe AppConfig i ConnectionString sekcje:

var config = System.Configuration.ConfigurationManager.OpenExeConfiguration(Reflection.Assembly.GetExecutingAssembly().Location); 

typeof(Configuration.ConfigurationElementCollection).GetField("bReadOnly", Reflection.BindingFlags.Instance | Reflection.BindingFlags.NonPublic).SetValue(System.Configuration.ConfigurationManager.ConnectionStrings, false); 
foreach (Configuration.ConnectionStringSettings conn in config.ConnectionStrings.ConnectionStrings) 
    System.Configuration.ConfigurationManager.ConnectionStrings.Add(conn); 

foreach (Configuration.KeyValueConfigurationElement conf in config.AppSettings.Settings) 
    System.Configuration.ConfigurationManager.AppSettings(conf.Key) = conf.Value; 

widział część ConnectionString here

11

Wystarczy dodać "app.config" plik do projektu testów jednostkowych . Będzie czytać automatycznie.

+3

Czasami najprostsze rozwiązania są najlepsze - działa to dla mnie, zamiast na wszystkich odprawianiu się z OpenExeConfiguration i tym podobnych ... – noonand

+0

To nie działało dla mnie :( – cbillowes

Powiązane problemy