2013-07-10 3 views
13

Próbuję napisać test jednostkowy dla mojego projektu, ale nie pozwala on używać Menedżera konfiguracji. Teraz mój projekt jest skonfigurowany jakNie można użyć programu ConfigurationManager w projekcie testu jednostki

aplikacji ASP.Net (wszystkie strony aspx)

ProjectCore (wszystkie pliki C# - model)

ProjectTest (wszystkie testy)

w moim ProjectCore, Mogę uzyskać dostęp do obiektu ConfigurationManager z System.Configuration i przekazać informacje do projektu. Jednak, kiedy prowadził badania, w której bierze udział ConfigurationManager, pojawia się błąd

System.NullReferenceException: Object reference not set to an instance of an object. 

Oto przykład testu

using System.Configuration; 

[TestMethod] 
public void TestDatabaseExists() 
{ 
    //Error when I declare ConfigurationManager 
    Assert.IsNotNull(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString 
} 

w innych moich testów, ConfigurationManager.ConnectionStrings [ „ConnectionString” ] .ConnectionString jest tym, do czego ustawiam ciąg konfiguracyjny mojego adaptera danych i zwraca błąd zerowy w testach, ale nie wtedy, gdy faktycznie korzystam z witryny. Jakieś pomysły?

+0

Robicie badanej jednostki w jednostce przetestować swoją koncentrację powinien być konkretny sposób próbuje przetestować i należy usunąć zbędne zależności. w takim przypadku spróbuj kpić/moleing (użyj MS Mole/Pex) klasa system.configuration; to da rozwiązanie na pewno. – Rahul

+0

@JohnSaunders, więc w moim teście wyjątek NullReferenceException występuje, gdy faktycznie przypisuję ciąg do menedżera konfiguracji. na przykład ... String cs = ConfigurationManager.ConnectionStrings ["ConnectionString"]. ConnectionString – willykao

+0

@JohnSaunders, chyba że ConfigurationManager ma wartość zerową tylko w przypadku testu jednostkowego (ponieważ nie dostaję tego błędu w rzeczywistej ASP.aplikacji sieciowej), zastanawiam się, czy mogę faktycznie użyć menedżera konfiguracji w testach – willykao

Odpowiedz

21

To może być jeden z kilku problemów:

  1. nie dodano app.config do projektu ProjectTest.
  2. Nie dodano ciągu połączenia w pliku app.config.

+2

hahaha oops, miałem plik web.config zamiast app.config. Powodem było to, że miałem web.config w projekcie ASP.net, a ponieważ rdzeń nie potrzebuje pliku konfiguracyjnego, który działał, myślałem, że mogłem użyć tego samego, ale to noob, dzięki za przypomnienie – willykao

+0

Dzięki , miał ten sam problem. –

+0

Jesteś legendą, dziękuję! – Danrex

2

Robicie badanej jednostki w jednostce przetestować swoją stężenie powinno być konkretny sposób próbuje przetestować i należy usunąć zbędne zależności. w takim przypadku spróbuj kpić/pieprzyć (używać Microsoft Mole i Pex) klasę system.configuration; to da rozwiązanie na pewno.

Co mam na myśli, po zainstalowaniu MS moles-and-pex -> w testowym rozwiązaniu projektowym -> kliknij prawym przyciskiem myszy zespół systemowy i wybierz Utwórz kreta.

To da ci mole'edową wersję klasy konfiguracyjnej, która z kolei będzie miała wyśmiewaną wersję configuration class - za pomocą której możesz ominąć problem, przed którym stoisz.

0

Jest związany z parametrem/noisolation w wierszu poleceń mstest.exe. Pomijając parametr/noisolation, to działa.

+0

To naprawdę komentarz, a nie odpowiedź. Gdy uzyskasz wystarczającą reputację, [będziesz mógł dodawać komentarze] (// stackoverflow.com/privileges/comment). –

0

Można również użyć specjalnych ścieżek konfiguracyjnych z ExeConfigurationFileMap:

// Get the machine.config file. 
ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap(); 
// You may want to map to your own exe.config file here. 
fileMap.ExeConfigFilename = @"C:\test\ConfigurationManager.exe.config"; 
// You can add here LocalUserConfigFilename, MachineConfigFilename and RoamingUserConfigFilename, too 
System.Configuration.Configuration config = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);