Jednostka testująca aplikację.plik konfiguracyjny z NUnit

Kiedy testujecie aplikację, która opiera się na wartościach z aplikacji.plik konfiguracyjny? Jak sprawdzić, czy te wartości są poprawnie odczytywane i jak Twój program reaguje na nieprawidłowe wartości wprowadzone do pliku konfiguracyjnego?

Byłoby śmieszne, aby zmodyfikować plik konfiguracyjny dla aplikacji NUnit, ale nie mogę odczytać wartości z aplikacji.config chcę przetestować.

Edit: chyba powinienem wyjaśnić. Nie martwię się o ConfigurationManager nie odczytać wartości, ale interesuje mnie testowanie, jak mój program reaguje na wartości wczytane.

Author: Dana, 2008-10-04

13 answers

Zazwyczaj izoluję zewnętrzne zależności, jak np. odczyt pliku konfiguracyjnego w ich własnej klasie o bardzo małej funkcjonalności. W testach mogę stworzyć makietę tej klasy, która implementuje i używa jej zamiast prawdziwego pliku konfiguracyjnego. Możesz tworzyć własne makiety lub używać do tego frameworku, takiego jak moq lub Rhino mocks.

W ten sposób można łatwo wypróbować kod z różnymi wartościami konfiguracyjnymi bez pisania skomplikowanych testów, które najpierw zapisują pliki konfiguracyjne XML. Na kod odczytujący konfigurację jest zwykle tak prosty, że wymaga bardzo niewiele testów.

 43
Author: Mendelt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-03 21:16:03

Możesz zmodyfikować sekcję konfiguracji w czasie wykonywania w Ustawieniach testowych. Np.:

// setup
System.Configuration.Configuration config = 
     ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
config.Sections.Add("sectionname", new ConfigSectionType());
ConfigSectionType section = (ConfigSectionType)config.GetSection("sectionname");
section.SomeProperty = "value_you_want_to_test_with";
config.Save(ConfigurationSaveMode.Modified);
ConfigurationManager.RefreshSection("sectionname");

// carry out test ...

Możesz oczywiście skonfigurować własne metody pomocnicze, aby zrobić to bardziej elegancko.

 30
Author: SteveC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-19 12:09:15

Można wywołać metodę set ConfigurationManager.AppSettings, aby ustawić wartości wymagane dla tego konkretnego testu jednostkowego.

[SetUp]
public void SetUp()
{
  ConfigurationManager.AppSettings.Set("SettingKey" , "SettingValue");
  // rest of unit test code follows
}

Gdy test jednostkowy zostanie uruchomiony, to użyje tych wartości do uruchomienia kodu

 20
Author: Pervez Choudhury,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-08 10:35:15

Możesz zarówno odczytywać, jak i zapisywać do pliku app.config za pomocą klasy ConfigurationManager

 16
Author: Steven A. Lowe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-19 12:10:02

Miałem podobne problemy z Internetem.config.... Znalazłem ciekawe rozwiązanie. Możesz enkapsulować funkcję odczytu konfiguracji, np. coś takiego:

public class MyClass {

public static Func<string, string> 
     GetConfigValue = s => ConfigurationManager.AppSettings[s];

//...

}

A następnie normalnie używać

string connectionString = MyClass.GetConfigValue("myConfigValue");

Ale w teście jednostkowym inicjalizuj" override " funkcję tak:

MyClass.GetConfigValue = s =>  s == "myConfigValue" ? "Hi", "string.Empty";

Więcej na ten temat:

Http://rogeralsing.com/2009/05/07/the-simplest-form-of-configurable-dependency-injection/

 11
Author: Tuomas Hietanen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-19 12:11:05

Bardziej eleganckim rozwiązaniem jest użycie zwykłego starego wtrysku zależności od samych ustawień konfiguracyjnych. IMHO to jest czystsze niż trzeba wyśmiewać konfigurację odczytu klasy / wrappera itp.

Na przykład, powiedzmy, że Klasa "Weather" wymaga "ServiceUrl" do działania (np. Zamiast mieć jakąś linijkę kodu, która aktywnie przechodzi do pliku konfiguracyjnego, aby uzyskać to ustawienie (niezależnie od tego, czy kod jest w klasie Weather, czy oddzielny czytnik konfiguracji, który może być wyśmiewany, jak na niektóre z innych odpowiedzi), Klasa Weather może pozwolić na wstrzyknięcie ustawienia, albo poprzez parametr do konstruktora, lub ewentualnie poprzez Ustawiacz właściwości. W ten sposób testy jednostkowe są niezwykle proste i bezpośrednie, a nawet nie wymagają wyśmiewania.

Wartość ustawienia może być następnie wstrzykiwana za pomocą inwersji kontenera Control (lub Dependency Injection), więc odbiorcy klasy Weather nie muszą jawnie dostarcz wartość skądś, ponieważ jest obsługiwana przez kontener.

 3
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-22 22:29:57

To mi pomogło:

 public static void BasicSetup()
  {
     ConnectionStringSettings connectionStringSettings = 
          new ConnectionStringSettings();
     connectionStringSettings.Name = "testmasterconnection";
     connectionStringSettings.ConnectionString = 
          "server=localhost;user=some;database=some;port=3306;";
     ConfigurationManager.ConnectionStrings.Clear();
     ConfigurationManager.ConnectionStrings.Add(connectionStringSettings);
  }
 2
Author: yonexbat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-19 12:12:13

Możesz zawsze zawinąć bit odczytu w interfejsie i mieć określoną implementację wczytaną z pliku konfiguracyjnego. Następnie piszesz testy za pomocą Mock obiektów, aby zobaczyć, jak program radzi sobie ze złymi wartościami. Osobiście nie testowałbym tej konkretnej implementacji, ponieważ jest to kod. NET Framework (i zakładam-mam nadzieję-że MS już go przetestował).

 1
Author: Yuval,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-03 21:13:48

System.Konfiguracja.Abstrakcje to piękna rzecz, jeśli chodzi o testowanie tego typu rzeczy.

Oto strona projektu GitHub z dobrymi przykładami: wpisz tutaj Opis linku

Oto strona NuGet: https://www.nuget.org/packages/System.Configuration.Abstractions/

Używam tego w prawie wszystkich moich projektach. NET.

 1
Author: jakejgordon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-11 13:19:30

Właściwie, myśląc o tym dalej, przypuszczam, że powinienem stworzyć klasę ConfigFileReader do użycia w moim projekcie, a następnie sfałszować ją w uprzęży testów jednostkowych?

Czy to normalne?

 0
Author: Dana,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-03 21:12:02

Najprostszą opcją jest owinięcie metod, które odczytują konfigurację w taki sposób, aby można je było zastąpić wartościami podczas testowania. Utwórz interfejs, którego używasz do odczytu config i poproś, aby implementacja tego interfejsu została przekazana jako parametr konstruktora lub ustawiona na obiekcie jako właściwość(tak jak w przypadku iniekcji zależności/inwersji sterowania). W środowisku produkcyjnym, pass w implementacji, która naprawdę czyta z konfiguracji; w środowisku testowym, pass w implementacja testowa zwracająca znaną wartość.

Jeśli nie masz opcji refaktoryzacji kodu pod kątem testowalności, ale nadal musisz go przetestować, Typemock Isolator zapewnia możliwość symulowania klas konfiguracji. NET framework, więc możesz po prostu powiedzieć " następnym razem, gdy Poproszę o taką i taką wartość appSettings, Zwróć tę znaną wartość."

 0
Author: Travis Illig,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-03 21:43:51

Miałem ten sam problem,

Możesz użyć Nunit-console.exe c:\path1\testdll1.dll c:\path2\testdll2.dll

To działa dobrze, nawet jeśli oba biblioteki DLL wskazują na inną aplikację.configs ex testdll1.dll.config i testdll2.dll.config

Jeśli chcesz użyć NUnit project config i owinąć te dwie biblioteki DLL to nie ma mowy, że możesz mieć dwa configs

Musisz mieć project1.config jeśli twoim projektem Nunit jest project1.nunit w tym samym miejscu co Project1.nunit siada.

Hope this helps

 0
Author: sundar venugopal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-30 07:36:26

Cóż, po prostu miałem ten sam problem... Chciałem przetestować projekt BL, który jest odwołany ze strony internetowej . ale chciałem przetestować tylko BL. Tak więc w zdarzeniu pre-build projektu testowego kopiuję aplikację.Pliki konfiguracyjne do folderu bin\debug i odwołaj się do nich z aplikacji.config ...

 0
Author: user798990,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-13 08:20:42