Nauczyłem się robić Test Driven Development (TDD), Dependency Injection (DI) i Inversion of Control (IoC) jednocześnie. Kiedy piszę kod za pomocą TDD, zawsze używam DI w konstruktorach mojej klasy. Zastanawiam się, czy to z powodu tego, jak nauczyłem się robić TDD, czy jest to naturalny efekt uboczny TDD.
Moje pytanie brzmi więc: czy przestrzeganie zasad TDD i pisanie testów jednostkowych, które nie zależą od usług zewnętrznych, nieuchronnie prowadzi do DI?
Odpowiedzi:
W przypadku szerokich definicji DI, tak. Klasy nie istnieją w próżni, więc muszą jakoś wypełnić swoje zależności. Czasami samo podanie wartości jest w porządku. Czasami musisz podać próbny konstruktor. Czasami za pośrednictwem kontenerów IoC. Czasami za pośrednictwem prywatnego akcesorium testowego. To wszystko wstrzykuje coś testowego do klasy, aby mogło działać w izolacji.
źródło
Dla osób, które już wiedzą o DI, ale nigdy nie widziały sensu, myślę, że testy jednostkowe prawie zawsze prowadzą do użycia DI.
Jeśli nie wiesz o DI i próbujesz pisać testy jednostkowe, niektórzy naturalnie wymyślą DI, inni będą sfrustrowani i ostatecznie odkryją DI na podstawie badań, ale zdziwisz się, jak często komuś to nie przydarzy się że może istnieć lepszy sposób na architekturę ich oprogramowania, aby ułatwić testowanie jednostkowe. Ci ludzie odpisują testy jednostkowe jako trudne i poddają się.
źródło
Testy jednostkowe doprowadzą do DI (ponieważ zmusza cię do tworzenia luźno powiązanych jednostek). TDD niekoniecznie, ponieważ TDD może być również używany do tworzenia testów warstwa po warstwie, zamiast „testów dosadnych”. Zobacz ten artykuł
http://stephenwalther.com/archive/2009/04/11/tdd-tests-are-not-unit-tests.aspx
dla wyjaśnienia różnic.
źródło
Tak i nie: TDD prowadzi do napisania dobrze ustrukturyzowanego kodu, który sam prowadzi do DI.
Rozumiem przez to, że TDD ogólnie wysyła właściwą drogę do enkapsulacji, SRP i ponownego użycia. Nie chodzi tylko o przeprowadzenie testów w kodzie: chodzi o wykorzystanie tych testów do opracowania lepszego projektu. Jeśli obiekt tworzy własne zależności, to żyje w określonym kontekście w określonej aplikacji i prawdopodobnie będzie w większym stopniu wpleciony w aplikację. DI jest dobrą rzeczą, nie tylko z testowego punktu widzenia, ale także z punktu widzenia jakości kodu.
źródło
Jak już wskazano w innych odpowiedziach, TDD nie wymaga testów jednostkowych . Równie dobrze możesz pisać testy integracyjne / funkcjonalne podczas TDD. Spośród kilku sposobów zastosowania TDD, tworzenie testów jednostkowych byłoby sposobem „podróbki, dopóki się nie uda” (szczegóły w książce Kent Beck).
Jeśli chodzi o „TDD nieuchronnie prowadzi do DI”, to na pewno nie. Podczas pisania testów jednostkowych potrzebne jest izolowanie testowanej jednostki od implementacji jej zewnętrznych zależności. Można to zrobić równie łatwo z DI lub bez. Prawdopodobnie najlepszym sposobem jest użycie odpowiedniego narzędzia do izolacji / kpin.
źródło