Pracuję nad projektem, w którym jest dużo zewnętrznych wiadomości usługowych. Dobrym sposobem na opisanie tego w nieco "hiperboli" byłoby aplikacja, w której system musi wysyłać wiadomości do interfejsu Flicker API, interfejsu API Facebooka i interfejsu API Netflix.Używanie próbnych obiektów poza testowaniem, zła praktyka?
Aby obsłużyć rozłączone scenariusze, problemy z logowaniem, użyteczność programistów, konfigurację itp. Eksperymentowałem z wykorzystaniem podejścia, które w dużym stopniu wykorzystuje drzewa generyczne i wyrażenia. Wynik końcowy wygląda tak:
Messenger<NetflixApi>.SendCustom(netflix => netflix.RecommendMovie("my message"));
Ogólnie jestem zadowolony z efektu końcowego, ale czuję się jakbym popełnił błąd, albo wychodził na główny projekt gdzieś w odniesieniu do badań i odłączony scenariuszy.
Podczas testów, zautomatyzowanych, opartych na jednostkach lub ludziach, zaimplementowałem fabrykę obiektów, która początkowo używa DI, aby wykonać właściwą akcję w "trybie na żywo" i użyła Mocks, aby zapewnić rodzaj sterylnego komunikatora, który nie robi ". w ogóle nie robić niczego w trybie testowym.
Widziałem lub czytałem tylko o Mokach używanych w czystym trybie TDD i nie będąc przyzwyczajonym do bycia głupim obiektem. Podejścia, które widziałem, obróciłyby się wokół niedokładności lub szyderstwa funkcji komunikacji HTTP, od której zależą wszystkie interfejsy API, z których korzystam.
Moim głównym zmartwieniem jest to, że wszystkie usługi, z którymi zamierzam się połączyć, wymagałyby dużej ilości szczegółowej pracy zastępującej konkretną implementację HTTP, a gdybym użył metody pośredniej, miałbym 3 klasy dla każda z tych usług (IService, ConcreteService, StubService) i utrzymywanie tych podczas wdrażania nowej metody lub zmiany czegokolwiek będzie prawdziwą PITA.
W obecnej wersji używam Mocks, aby uzyskać "tryb sterylny" za darmo prawie bez konieczności implementowania czegokolwiek dodatkowego tylko po to, aby dostosować się do określonej jednostki testującej.
Pytanie brzmi: czy czegoś brakuje? Czy złamałem zasadę projektu przy użyciu Mocks w bardziej ... wygodny sposób?
Czy ktoś może doradzić, jak uzyskać sterylny tryb z wielu różnych usług zewnętrznych, nie skacząc przez wiele kół?
Czy to pytanie ma sens?
Dzięki za wszystkie odpowiedzi.
Edytuj nr 1:
Nie było jasne w moim pierwotnym pytaniu. Wszelkie obiekty puste lub fałszywe mogą być używane wyłącznie w środowisku programowania/debugowania/testowania. W produkcji kod, który przesyła te wiadomości, będzie faktyczną ich implementacją.
Głosowałem za każdym razem, ponieważ wydaje się, że istnieje wiele różnych rozwiązań tego problemu i będę je badał.
Proszę nie sądzić, że to pytanie zostało już odebrane, będę wdzięczny za radę, jaką mogę uzyskać.
Po drugie, gdy zobaczyłem temat tego wątku, pojawił się czerwony alert "Null Object" ... – abyx