2013-07-05 16 views
5

Jestem względnie nowy w testowaniu jednostkowym i bardzo nowym w C#, ale próbowałem przetestować kod, który używa klas statycznych metodami statycznymi i wygląda na to, że mam napisać ogromne ilości kodu standardowego w celu przetestowania, a ten kod również prawdopodobnie musiałby zostać przetestowany.Testowanie klas statycznych i metod w języku C# .NET

Na przykład: używam klasy System.Web.Security.Membership, z metodą ValidateUser na jej temat. Wygląda na to, że muszę utworzyć interfejs IMembership zawierający metodę ValidateUser, a następnie utworzyć klasę MembershipWrapper, która implementuje IMembership, implementując metodę ValidateUser i przekazując argumenty do rzeczywistej klasy Membership. Następnie potrzebuję mieć właściwości na mojej klasie, która używa Membership, aby odwołać się do opakowania, aby móc wstrzyknąć zależność dla symulowanego obiektu podczas testowania.

Aby przetestować 1 linię kodu korzystającą z Membership, musiałem utworzyć interfejs i klasę oraz dodać właściwość i kod konstruktora do mojej klasy. To wydaje się złe, więc muszę coś złego zrobić. Jak powinienem sprawdzać te testy? Przyjrzałem się krótko niektórym frameworiom/bibliotekom, które stosują iniekcję zależną, ale nadal wydają się wymagać mnóstwa danych podstawowych lub bardzo głębokiego zrozumienia tego, co dzieje się pod maską.

Odpowiedz

3

Nie widzę niczego złego w tworzeniu luźnego sprzężenia systemu. Uważam, że nie narzekasz na tworzenie parametrów konstruktora i przekazywanie abstrakcyjnych zależności swoim klasom. Ale tworzenie instancji zależności w miejscu wygląda o wiele łatwiej, prawda?

Ponadto, jak wskazałem w komentarzach, można później ponownie użyć opakowania. To nie jest tak bezużyteczna praca, jak się wydaje na pierwszy rzut oka.

+0

Jestem za to, że mój kod luźno, a wtrysk zależność wydaje się, że sposób, aby to zrobić.Wydaje się, że jeśli coś tak podstawowego i ważnego dla każdej aplikacji będzie wymagało tak dużo kodu, to zostałoby to rozwiązane, ale nie mogę znaleźć niczego, co by tak wyglądało, rozwiązuje problem. – danpalmer

+0

@danpalmer faktycznie możesz użyć czegoś takiego jak TypeMock do udawania statycznych metod, ale to nie sprawi, że twój kod luźno sprzężony –

+0

Tak, TypeMock nie jest tak naprawdę opcją, ponieważ jest to płatne oprogramowanie i trzymam się rzeczy open source tak bardzo jak mogę w tej sprawie. Ale dzięki za rekomendację. – danpalmer

3

Jesteś na dobrej drodze i uważasz, że nie testujesz pojedynczej linii kodu, w tym przypadku piszesz ważny test, aby upewnić się, że twój kod współdziała z dostawcą członkostwa we właściwy sposób, to nie jest prosty test jednostkowy raczej "testowy" test integracji. Myślę, że warto tworzyć wszystkie te makiety i zostały objęte testami tę część aplikacji.

I tak, wydaje się, że jest to przesada, ale w żaden inny sposób - albo używasz niektórych pomocników/bibliotek, albo sam rządzisz niezależnymi statycznymi zależnościami.

0

I nie jesteś szczęśliwy przyjmując podejście iniekcji konstruktora, można spojrzeć na użyciu Ambient Context

Zasadniczo ustawić domyślną, która będzie nazywać System.Web.Security.Membership.ValidateUser

Następnie wywołać metodę narażoną na kontekst w twoim kodzie i możesz teraz wyśmiać go dla twoich testów

To pozwala ci napisać mniej kodu instalacyjnego, ale także ukrywa fakt, że masz zależność, która może być problemem w przyszłości (w zależności od tego, jak "ponowne używanie kodu")

0

Jeśli korzystasz z VS2012, zawsze możesz używać podkładek w trybie Microsoft Fake dla połączeń statycznych (lub połączeń z biblioteki .NET).

http://msdn.microsoft.com/en-us/library/hh549175(v=vs.110).aspx

http://msdn.microsoft.com/en-us/library/hh549176.aspx

+0

Powodem, dla którego napotykam te problemy, jest to, że migruję z dala od podróbek. Nie mogę mieć zależności od IDE, które kosztuje tyle. – danpalmer

+0

@danpalmer Ok, ograniczenia takie jak ten nie zostały zasugerowane w pytaniu. Powiedział, że VS2012 Express jest bezpłatny. – Gjeltema

+0

Struktura Fakes jest dostępna tylko w wersjach Premium i Ultimate zgodnie ze stroną porównania funkcji. – danpalmer

Powiązane problemy