Utknąłem w tym miejscu kodu, z którego nie wiem jak wyszydzić:
ConfigurationManager.AppSettings["User"];
Muszę kpić z ConfigurationManager, ale nie mam pojęcia, używam Moq .
Ktoś może dać mi wskazówkę? Dzięki!
źródło
Utknąłem w tym miejscu kodu, z którego nie wiem jak wyszydzić:
ConfigurationManager.AppSettings["User"];
Muszę kpić z ConfigurationManager, ale nie mam pojęcia, używam Moq .
Ktoś może dać mi wskazówkę? Dzięki!
Uważam, że jednym standardowym podejściem do tego jest użycie wzorca fasady do owinięcia menedżera konfiguracji, a wtedy masz coś luźno powiązanego, nad którym masz kontrolę.
Więc opakowałbyś plik ConfigurationManager. Coś jak:
public class Configuration: IConfiguration
{
public User
{
get
{
return ConfigurationManager.AppSettings["User"];
}
}
}
(Możesz po prostu wyodrębnić interfejs z klasy konfiguracji, a następnie użyć tego interfejsu wszędzie w kodzie). Następnie po prostu mockujesz IConfiguration. Możesz być w stanie zaimplementować samą elewację na kilka różnych sposobów. Powyżej wybrałem po prostu zawinięcie poszczególnych właściwości. Dodatkową korzyścią jest również posiadanie silnie wpisanych informacji do pracy, a nie słabo wpisanych tablic mieszających.
var configurationMock = new Mock<IConfiguration>();
i dla konfiguracji:configurationMock.SetupGet(s => s.User).Returns("This is what the user property returns!");
Używam AspnetMvc4. Przed chwilą pisałem
w mojej metodzie testowej i zadziałało idealnie.
Objaśnienie: metoda testowa działa w kontekście z ustawieniami aplikacji pobranymi z, zwykle a
web.config
lubmyapp.config
.ConfigurationsManager
może dotrzeć do tego globalnego obiektu aplikacji i nim manipulować.Chociaż: jeśli masz biegacza testowego, który równolegle przeprowadza testy, nie jest to dobry pomysł.
źródło
ConfigurationManager.AppSettings
jestNameValueCollection
który nie jest bezpieczny dla wątków, więc równoległe testy z jego użyciem bez odpowiedniej synchronizacji i tak nie są dobrym pomysłem. W przeciwnym razie możesz po prostu sprawdzićConfigurationManager.AppSettings.Clear()
swojegoTestInitialize
/ ctora i jesteś złoty.Może nie jest to to, co musisz osiągnąć, ale czy rozważałeś użycie pliku app.config w swoim projekcie testowym? Więc ConfigurationManager otrzyma wartości, które umieścisz w app.config i nie musisz niczego mockować. To rozwiązanie działa dobrze na moje potrzeby, ponieważ nigdy nie muszę testować pliku konfiguracyjnego „zmiennej”.
źródło
Web.config
obejmującego. Podczas testowania pobieranie niektórych dobrze znanych wartości z programuapp.config
jest bardzo ważne. Test jednostkowy musi tylko upewnić się, że warunki w momencie ściągania działają, na przykład „klaster1”; w tym przypadku istnieją tylko 4 różne klastry.Możesz użyć podkładek, aby zmodyfikować obiekt
AppSettings
niestandardowyNameValueCollection
. Oto przykład, jak możesz to osiągnąć:Więcej informacji na temat podkładek i podróbek można znaleźć pod adresem Isolating Code Under Test with Microsoft Fakes . Mam nadzieję że to pomoże.
źródło
Czy zastanawiałeś się nad kiciem zamiast kpiny? Plik
AppSettings
Obiekt jestNameValueCollection
:Korzyści to prostsza implementacja i brak zależności od System.Configuration, dopóki naprawdę tego nie potrzebujesz.
źródło
IConfiguration
jak sugeruje Joshua Enfield, może być zbyt wysokim poziomem i możesz przegapić istniejące błędy z powodu takich rzeczy, jak złe analizowanie wartości konfiguracji. Z drugiej strony, używanieConfigurationManager.AppSettings
bezpośrednio, jak sugeruje LosManos, jest zbyt dużym szczegółem implementacji, nie wspominając o tym, że może mieć skutki uboczne w innych testach i nie może być używane w równoległych przebiegach testów bez ręcznej synchronizacji (ponieważNameValueConnection
nie jest bezpieczne dla wątków).To jest właściwość statyczna, a Moq jest przeznaczony do metod lub klas instancji Moq, które mogą być mockowane przez dziedziczenie. Innymi słowy, Moq nie pomoże ci tutaj.
Do kpiny ze statyki używam narzędzia o nazwie Moles , które jest bezpłatne. Istnieją inne narzędzia do izolacji struktury, takie jak Typemock, które również mogą to zrobić, chociaż uważam, że są to narzędzia płatne.
Jeśli chodzi o statykę i testowanie, inną opcją jest samodzielne utworzenie stanu statycznego, chociaż często może to być problematyczne (tak jak wyobrażam sobie, że byłoby to w twoim przypadku).
I wreszcie, jeśli ramy izolacji nie wchodzą w grę i jesteś oddany temu podejściu, fasada, o której wspomniał Joshua, jest dobrym podejściem lub ogólnie dowolnym podejściem, w którym kod klienta należy oddzielić od logiki biznesowej, którą używam do testowania.
źródło
Myślę, że napisanie własnego dostawcy app.config jest prostym zadaniem i jest bardziej przydatne niż cokolwiek innego. Szczególnie należy unikać wszelkich podróbek, takich jak podkładki itp., Ponieważ gdy tylko ich użyjesz, Edycja i Kontynuuj przestaje działać.
Dostawcy, których używam, wyglądają tak:
Domyślnie pobierają wartości z,
App.config
ale w przypadku testów jednostkowych mogę zastąpić wszystkie wartości i używać ich w każdym teście niezależnie.Nie ma potrzeby stosowania żadnych interfejsów ani implementowania go za każdym razem. Mam bibliotekę DLL z narzędziami i używam tego małego pomocnika w wielu projektach i testach jednostkowych.
źródło
Co powiesz na ustawienie tego, czego potrzebujesz? Ponieważ nie chcę kpić z .NET, prawda?
Prawdopodobnie powinieneś wcześniej wyczyścić AppSettings, aby upewnić się, że aplikacja widzi tylko to, co chcesz.
źródło