2012-09-10 29 views
5

Jeśli można zmienić zachowanie pozorowane w Rhino Mocks przy pomocy mock.Stub(). Return(), dlaczego i tak potrzebujemy skrótów?Rhino Mocks - Czy naprawdę potrzebujemy stubów?

Co stracimy, używając zawsze MockRepository.GenerateMock()?

Jedną z dużych zalet używania Mocks zamiast Stubs jest to, że będziemy mogli ponownie użyć tego samego egzemplarza spośród wszystkich testów, dzięki czemu będą one bardziej przejrzyste i proste.

Moq framework działa w podobny sposób ... nie mamy różnych obiektów dla makiet i stubów.

(proszę, nie odbieraj z linkiem do Fowlera „Mocks nie są odcinki” artykuł)

Odpowiedz

3

Jest całkiem jasne odpowiedź in the documentation:

makiety jest obiektem, który możemy może ustawić oczekiwania na, i które będą sprawdzić, czy rzeczywiście oczekiwane działania rzeczywiście miały miejsce. Kod pośredniczący to obiekt , którego używasz w celu przekazania do testowanego kodu. Możesz oczekiwać na nim konfiguracji, więc działałoby to w określony sposób, ale te oczekiwania nie zostaną zweryfikowane. Właściwości stuba będą automatycznie zachowywać się jak zwykłe właściwości i nie można na nich ustawić oczekiwań.

Jeśli chcesz zweryfikować zachowanie testowanego kodu, będziesz używać próbnego z odpowiednimi oczekiwaniami i sprawdź, czy. Jeśli chcesz po prostu przekazać wartość, która może wymagać działania w określony sposób, ale nie jest celem tego testu, użyjesz kodu pośredniczącego.

WAŻNE: Kikut nigdy nie spowoduje niepowodzenia testu.

+0

To pojęcie odgałęzienie kontra mock, ale jak już mówiłem w pytaniu, można użyć makiety jako stub z Rhino. Więc wracając do mojego pytania, jaka korzyść wynika z posiadania dwóch oddzielnych obiektów? Co tracimy, używając zawsze MockRepository.GenerateMock()? –

+0

Tak, * możesz * używać makiety jako kodu pośredniczącego. Jednak, jak wspomniano powyżej, jeśli nie chcesz, aby Twoja próbka wpłynęła na wynik testu, użyj kodu pośredniczącego. –

+0

Czy możesz wyjaśnić, dlaczego? Co powiesz na pokazanie jakiegoś kodu, który udowodni Twoją argumentację? –

6

Należy pamiętać, że Rhino nie jest już rozwijany . Nowe ramy upuścić tę różnicę mock-skrótowe całkowicie i wprowadzić jednolity czas na test podwaja:

Ewolucja mocy King frameworki wydają się przesuwać w kierunku "jednego ogólnego celu", zamiast mieć oddzielne różne w zależności od kontekstu przypadku testu.

Aby dowiedzieć się więcej na temat, że separacja (mock, Pniak, fałszywe) pochodzi i jakich celów służył, sugeruję czytanie Mark Seemann's artykuł o continuum of test doubles:

Na jednym biegunie znajdziesz manekiny z absolutnie brak implementacji, a na drugim końcu są pełne wdrożenia produkcyjne.Manekiny i implementacje produkcyjne są dobrze zdefiniowane, ale trudniejsze do zidentyfikowania są: stubsy, szpiedzy i podróbki: kiedy szpieg testowy staje się fałszywy? Ponadto, mumy zamieszkują dość dużą przerwę w kontinuum, ponieważ w niektórych przypadkach mogą być dość złożone, ale w innych bardzo proste.


Mogłoby się wydawać, że Rhino nie rozróżnia makiety i odgałęzienie, ale istnieją subtelne różnice. Na przykład: użyj elementu pobierającego właściwość stubring:

var mock = MockRepository.GenerateMock<IService>(); 
mock.Stub(m => m.Property).Return(42); 

Tak właśnie musisz to zrobić, gdy obiekt jest sztuczny. Stub drugiej strony, wprowadza semantykę własności, które trywializowania całą rzecz:

var stub = MockRepository.GenerateStub<IService>(); 
stub.Property = 42; 

Mimo że jest jedynym, który przychodzi mi do głowy w tej chwili, nie może być trochę więcej. Ale nadal są to drobne niuanse.

1: Zgodnie z 05/19/2013, to nie może już uznać za prawdziwe: Rhino Mocks new home

+0

Użyłem moq w niektórych projektach i kochałem! Ale teraz pracuję nad projektem, który wykorzystuje Rhino ... więc staram się zrozumieć, dlaczego nie możemy po prostu zapomnieć o skrótach i użyć Mocka do obu celów z tym środowiskiem, tak jak robimy to z moq. –

+0

BTW, tks za udostępnienie artykułu ... Przyjrzę się! –

+1

@MarceloOliveira: Jestem pewien, że gdyby powstał Rhino, nie mielibyśmy dwóch oddzielnych typów. Generalnie masz rację, nie ma dużych różnic między stubem a makietą. Jednakże ** istnieją ** niektóre (niewielkie jednak). Zobacz na przykład moją zaktualizowaną odpowiedź. –

Powiązane problemy