Czy powinniśmy wyśmiewać byty i wyceniać obiekty podczas wykonywania DDD?

9

Po przeczytaniu kilku artykułów o odnawialny vs iniekcyjne obiektów i jak te pojęcia odnoszą się do usług DDD jest, podmiotów i przedmiotów wartości, pozostało mi pewne wątpliwości dotyczące korzystania newables w moim kodu szczególnie w moich testów jednostkowych.

Głównymi kandydatami na newables były obiekty Entities i Value, co oznacza, że ​​zamiast wstrzykiwać te zależności do innych obiektów, należy po prostu newinstancję tych obiektów i używać ich bezpośrednio w kodzie.

Jednak dobre praktyki DDD zalecają przypisywanie odpowiedzialności podmiotom i wycenianie obiektów, jeśli zostaną one uznane za właściwe. Tak więc podmioty i obiekty wartości przestaną mieć poważną logikę biznesową.

Teraz, jeśli usługa działa na encji lub obiekcie wartości, czy powinienem kpić z encji lub obiektu wartości i przekazać próbkę do usługi (wyśmiewanie będzie wymagało interfacedla obiektów wartości lub encji, które wydają się być odradzane)?

A może powinienem po prostu obiekt newencji / wartości i przekazać konkretną implementację do usługi, naruszając w ten sposób zasadę testowania jednostkowego testowania tylko jednej jednostki?

Songo
źródło
Powiązane: stackoverflow.com/q/2833422
Robert Harvey
Zależy to od tego, czy jesteś testerem klasycznym czy mockist: martinfowler.com/articles/mocksArentStubs.html
jhewlett
@jhewlett Klasycysta niczego nie wyśmiewał; mockist najprawdopodobniej wyśmiewałby tylko Usługi, Repozytoria i Fabryki (które są „wstrzykiwalne”), nigdy Jednostki ani Obiekty Wartości (które są „newables”).
Rogério,
@ Rogério, kiedy mówisz Usługi; masz na myśli usługi aplikacyjne lub usługi domenowe?
w0051977
@Songo, o czym zdecydowałeś? Czy kpisz: byty; Wartości obiektów i usług domenowych?
w0051977

Odpowiedzi:

11

Czytam, że według ciebie testy jednostkowe, podobnie jak obiekty SOLID, muszą mieć „jeden powód do zerwania”. To szlachetny cel, ale myślę, że przekonasz się, że w wielu przypadkach jest to po prostu niewykonalne. Jednym z tych przypadków jest tutaj, w którym masz „bogaty” obiekt domeny (DDD rozróżnia jednostki i obiekty wartości, które oba obejmują „model domeny”), który jest zależnością testowanego systemu.

W takich sytuacjach mam podaną filozofięobiekt domeny ma swój własny kompleksowy zasięg testu jednostkowego, ufając, że obiekt będzie działał tak, jak został zaprojektowany w teście jednostkowym dla innego SUT, niekoniecznie narusza test jednostkowy. Gdyby ten test został zerwany z powodu przełomowej zmiany w domenie, oczekiwałbym również, że test jednostkowy obiektu domeny również się zepsuje, co doprowadzi mnie do czegoś do zbadania. Jeśli test jednostkowy obiektu domeny został poprawnie zaktualizowany jako test czerwony, a następnie zmienił się na zielony wraz ze zmianą, a ten drugi test nie powiódł się, niekoniecznie jest to zła rzecz; oznacza to, że oczekiwania tego drugiego testu są sprzeczne z nowymi oczekiwaniami dla domeny, i muszę upewnić się, że oba zgadzają się ze sobą i nadrzędnymi kryteriami akceptacji systemu.

W związku z tym wyśmiewałbym obiekt domeny tylko wtedy, gdy wspomniany obiekt domeny wywoływałby „skutki uboczne”, które byłyby niepożądane z perspektywy testów jednostkowych (tj. Dotykając zewnętrznych zasobów, takich jak magazyny danych), lub gdyby logika obiektu domeny była wystarczająco złożona umieszczenie go w odpowiednim stanie do testu staje się przeszkodą w zdefiniowaniu i zdaniu testu.

To staje się wtedy głównym pytaniem; co jest łatwiejsze? Używać obiektu domeny zgodnie z jego przeznaczeniem w teście, czy wyśmiewać? Rób to, co jest łatwiejsze, dopóki nie będzie to już łatwiejsza opcja, na przykład gdy zmiana funkcjonalna przerywa test usługi w złożony sposób; jeśli tak się stanie, przepisz test, aby utworzyć próbkę, która ujawnia wymagania funkcjonalne zależne od usługi, bez złożoności, która ją psuje.

Zrozum, że tak czy inaczej, powinien istnieć test integracji wykorzystujący prawdziwy obiekt domeny podłączony do prawdziwej usługi, który testuje interakcję między nimi na wyższym poziomie abstrakcji (np. Testowanie, na przykład, nie tylko funkcjonalności usługi) punkt końcowy, ale serwer proxy, przez który obiekt domeny jest serializowany i wysyłany).

KeithS
źródło
W DDD „model domeny” obejmuje także usługi domenowe, repozytoria i fabryki, a nie tylko jednostki i obiekty wartości.
Rogério,
0

Ufając klasie zależnej, że działa poprawnie, mając nadzieję, że niektóre testy jednostkowe zakończą się niepowodzeniem, gdy coś tam nie działa, należy to sprawdzić bardzo dobrze . Może brakuje niektórych ważnych testów jednostkowych? Może istnieć niesprawdzony przypadek, który spowodowałby błąd, który zostanie wygenerowany w mojej oryginalnej klasie testowej i nie zostałby złapany w samej klasie zależnej.

Dlatego moim zdaniem w przypadku testów jednostkowych klasy zależne powinny być wyśmiewane. Jeśli nie, to jest to test integracyjny.

Fabian Picone
źródło