Dlaczego miałbyś pisać testy jednostkowe dla kontrolerów?

22

Dla mnie jest to całkowicie nieistotny test jednostkowy i nie rozumiem, dlaczego ktoś spędzałby czas na pisaniu go, ponieważ bardzo niewiele można z niego zyskać. Wiedziałbym doskonale, czy ten kontroler zwrócił pożądany typ, wykonując metodę w przeglądarce. Naprawdę, czy uważasz, że do tego potrzebny jest test i dlaczego?

public class ConstituencyControllerTests
{
    private ConstituencyController _constituencyController;
    private Mock<IConstituencyService> _IConstituencyServiceMock;

    public ConstituencyControllerTests() {
        _IConstituencyServiceMock = new Mock<IConstituencyService>();
    }

    [Test]
    public async Task I_Check_For_Return_Type_And_Result() {
        _constituencyController = new ConstituencyController( _IConstituencyServiceMock.Object );

        var result = await _constituencyController.Get();
        var content = ( (dynamic)result ).Content;

        Assert.IsEmpty( content );
        Assert.IsInstanceOf( typeof( System.Web.Http.Results.OkNegotiatedContentResult<IEnumerable<ListOfConstituencies>> ), result );
        _IConstituencyServiceMock.Verify( x => x.ListOfConstituencies(), Times.Once() );
    }
}
lukier
źródło
7
Nie zgadzaj się z tym @gnat. Nie chodzi tu o konstrukcje językowe, ale o rodzaj wyniku zwracanego przez kontroler. Chociaż może sprowadzać się do tego samego, gdy nie masz hierarchii dziedziczenia, staje się zupełnie inną bestią, gdy kontroler oczekuje powrotu przodków, kontroler zwrócił osobę, a teraz osoba zostaje zmieniona, aby nie pochodzić od przodka, ale PeopleAncestor ... Odpowiada również, dlaczego testowanie takiej metody może być dobrym pomysłem ...;) Testy jednostkowe mają na celu wykrycie sytuacji, w których zmiana jednej rzeczy c / złamałaby coś innego.
Marjan Venema
Zwykle się zgadzam, zwykle nie spędzam dużo czasu na testowaniu punktów wejścia aplikacji. To jak testowanie jednostkowe głównej metody aplikacji konsolowej. po prostu nie ma dla mnie sensu.
Mvision

Odpowiedzi:

29

Kluczową kwestią jest tutaj:

Wiedziałbym doskonale, czy ten kontroler zwrócił pożądany typ, wykonując metodę w przeglądarce

Tesing jednostek polega na automatyzacji testowania nierejestracyjnego prostych jednostek kodu, a nie na tym, że wyglądasz sam. Nie chcesz robić zawsze jednostkowych modyfikacji w swojej aplikacji.

EDYCJA: Dodawanie komentarza @anotherdave:

Chodzi o łatwość skalowania. Testowanie jednego kontrolera w przeglądarce może być OK; a co z 10, 20, 50 kontrolerami? Raz napiszesz test; konieczne może być zaktualizowanie go po zmianie kontrolera, co jest narzutem. Ale jak często wdrażasz? Z pewnością ręczna kontrola za każdym razem, gdy jest znacznie więcej kosztów ogólnych niż w teście

Jako alternatywa dla odpowiedzi @ Vladislava testowanie jednostkowe absolutnie wszystkiego może być przesadą i naprawdę niepożądane. Jeśli potrzebujesz czegoś lżejszego, możesz przeprowadzić testy regresji wyższego poziomu za pomocą Selenium. Z pewnością uzyskasz mniejszy zasięg niż testy jednostkowe, ale możesz uzyskać raisonable zasięg, który kosztuje o wiele mniej czasu na testowanie jednostkowe i jest bardziej elastyczny.

Oznacza to, że jeśli przetestujesz wszystko, musisz zaktualizować jeden lub więcej testów za każdym razem, gdy modyfikujesz prosty element.

Walfrat
źródło
4
Również dodać re: I would know perfectly well if this controller returned the wanted type by executing the method in a browser.- chodzi o łatwość skalowania. Testowanie jednego kontrolera w przeglądarce może być OK; a co z 10, 20, 50 kontrolerami? Raz napiszesz test; konieczne może być zaktualizowanie go po zmianie kontrolera, co jest narzutem. Ale jak często wdrażasz ? Z pewnością ręczna kontrola za każdym razem, gdy jest znacznie więcej kosztów ogólnych niż w teście.
anotherdave
„Tesing jednostkowy dotyczy automatyzacji” - Prawidłowe, ale także testy integracyjne (Selenium / Webdriver / itp.). Nie sądzę, że jest to tak wycięte i suche, że testy jednostkowe są szybsze do wdrożenia niż testy integracyjne. Wiele zależy od podejścia, jednak jeśli uzyskanie skutecznego testu jednostkowego wymaga wykpienia kilkunastu różnych usług i wywołań wykonanych w każdej z nich, test integracji może być szybszy do wdrożenia i prostszy w utrzymaniu (choć ogólnie o wiele wolniejszy w działaniu, tak) . Chodzi o to, że wiele zależy od kontekstu i złożoności testowanego kodu.
aroth
Dodano komentarz @anotherdave
Walfrat,
@ zarówno mój punkt był odwrotny, pełny test jednostkowy kod jest czymś, co zajmuje dużo czasu i sprawia, że ​​kod jest bardzo trudny do zmiany bez konieczności przeprowadzania testów jednostkowych. Test integracji jest lżejszy. Oczywiście chciałbyś, aby test jednostkowy był bardzo skomplikowany, ale nie dlatego, że testowałeś tę część, że musisz przetestować wszystko. Po raz kolejny widzimy ludzi szukających srebrnej kuli tam, gdzie on nie istnieje.
Walfrat,
24

Dlaczego miałbyś pisać testy jednostkowe dla kontrolerów?

Ponieważ bez znajomości kontekstu nie można powiedzieć na pewno, czy trzeba to lub tamto przetestować. Oto kilka powodów, dla których warto przetestować kontrolery:

  • kontroler może zawierać złożoną logikę okablowania usługi, która jest podatna na błędy. Same usługi mogą działać dobrze, to wynik, który chcesz przetestować iz jakiegoś powodu zastanawiasz się, czy nie wprowadzić warstwy aranżacji do swojej aplikacji
  • twoje kontrolery zawierają CAŁĄ logikę biznesową aplikacji, a kontrolery są właściwie wszystkim, co MOŻESZ przetestować (proszę nie udawaj, że przez całe życie pracowałeś z idealnymi bazami kodów, są takie bazy danych, uwierz mi)
  • Twój zespół składa się z 99% geniuszy i 1% przeciętnych ludzi, a Ty chcesz utrzymać ten 1% z błędów w ich pensji
Vladislav Rastrusny
źródło
2
Dodałbym: „Nie można przewidzieć, kto w przyszłości pozbywa się projektu, a testy są częścią
samodokumentowanego
4
Do punktu środkowego projekt, który został stworzony bez testowania, może nie być testowany w inny sposób niż test kontrolera bez prób. Pracuję z zespołem C #, który ma dokładnie taki projekt pod swoją opieką, więc piszą testy kontrolerów, dopóki nie dodadzą niezbędnej struktury (interfejsów itp.), Aby móc przeprowadzić bardziej szczegółowe testy.
Wayne Conrad,
1

Całkowicie zgadzam się z PO.

Test jednostkowy kontrolera jest bezcelowy. Testujesz swoje kontrolery niejawnie za pomocą testów regresyjnych (na przykład używając Selenium).

Powinieneś TDD wszystkie komponenty / obiekty, których używa kontroler i utrzymywać kontrolery tak cienkie, jak to możliwe. Następnie wszystko jest odpowiednio testowane jednostkowo. Chcesz mieć pewność, że wszystko działa dobrze podczas wykonywania żądań internetowych. To testy regresji.

winkbrace
źródło
Może i tak, ale to nie jest odpowiedź na pytanie. W rzeczywistości jest to argument przeciwko stosowaniu testów jednostkowych.
JᴀʏMᴇᴇ
Myślę, że odpowiedziałem na pytanie „czy uważasz, że do tego potrzebny jest test i dlaczego?”
winkbrace,
Tak, myślę, że @winkbrace i podzielam te same opinie na ten temat. Ale wierzę też, że jest to dyskusja na temat tego, co powinieneś przetestować jednostkowo, a nie. Myślę, że ludzie testują za dużo i „złe” rzeczy. w moim przykładzie testowanie kontrolera daje bardzo małą wartość, ponieważ jest tak cienkie i mam nadzieję, że zawiera testy otaczające usługi. Wszystkie odpowiedzi tutaj są znaczące i mają dobre punkty, ale tak naprawdę nie można zaznaczyć jednej jako poprawnej odpowiedzi.
przymrozki
Logikę kontrolera można przetestować za pomocą automatycznych testów integracji, oddzielnych i niezależnych od testów jednostkowych dla poszczególnych komponentów.
KevBurnsJr
-1: Test jednostkowy kontrolera może być bezcelowy. Kontrolery dotyczą transformacji, ale czasami sama transformacja jest złożona i deweloper może chcieć ją objąć. Uważam również, że testy jednostkowe 1) ostatecznie dotyczą sprawdzania poprawności implementacji, niekoniecznie sprawdzania zachowania na wysokim poziomie, i 2) powinny być cholernie szybkie . Obie cechy sprawiają, że testy jednostkowe są znacznie bardziej przydatne w czasie wdrażania; innymi słowy, są one ostatecznie narzędziem dla programistów i, nawiasem mówiąc, sposobem na sprawdzenie jakości produktu.
rsenna