2009-11-11 12 views
14

patrz także „What should I consider when choosing a mocking framework for .NetJakie są rzeczywiste zalety i wady każdej z głównych szyderczych ram?

Staram się zdecydować w sprawie ram kpiącym użyć w projekcie .NET Mam niedawno rozpoczęły. Chciałbym przyspieszyć moje badania nad różnymi ramami. Niedawno przeczytałem ten post na blogu: http://codevanced.net/post/Mocking-frameworks-comparison.aspx i zastanawiałem się, czy którykolwiek z użytkowników StackOverflow ma cokolwiek do dodania w drodze do rzeczywistych zalet i zastrzeżeń do frameworków.

Czy ludzie mogliby wymienić zalety i wady szyderczych ram, których obecnie używają lub które zbadali na własny użytek w projektach .NET. Myślę, że nie byłaby to tylko pomoc dla mnie w podjęciu decyzji o moim obecnym projekcie, ale pomoże innym podejmować bardziej świadome decyzje przy wyborze właściwych ram dla ich sytuacji. Nie jestem ekspertem w każdej z ram, ale chciałbym, aby uzyskać argumenty za i przeciw głównych ram Natknąłem:

  • RhinoMocks
  • Min
  • TypeMock izolator
  • NMock
  • Moles

Oraz inne użyteczne alternatywy, że mam przegapić. Chciałbym również dowiedzieć się od użytkowników, którzy zmienili lub zaprzestali używania produktów z powodu problemów.

+8

Oprogramowanie kodujące jest wystarczająco trudne. Nie chciałbym używać takiego, który nieustannie mnie drwi z tego procesu. –

+1

Możesz znaleźć to pytanie i jego odpowiedzi przydatne: http: // stackoverflow.com/questions/642620/what-should-i-thought-when-choose-a-mocking-framework-for-net. Wskazuje również na kilka innych powiązanych pytań, w szczególności http://stackoverflow.com/questions/37359/what-c-mocking-framework-to-use. –

+0

Dzięki Jeff - są bardzo pomocni; Nie natknąłem się na nich, gdy szukałem tych informacji. – BenAlabaster

Odpowiedz

13

W ogóle nie znam Moli, ale omówię te, o których wiem trochę (naprawdę potrzebuję stolika do tego).

Min

Plusy

  • Type-safe
  • spójny interfejs
  • zachęca Dobry projekt

Wady

  • Nie jako w pełni funkcjonalny, jak niektórzy z jego konkurentów
    • nie może mock delegaci
    • To nie może nie zamówił oczekiwania
    • prawdopodobnie inne rzeczy nie mogę myśleć teraz ...
  • może jedynie mock interfejsy i wirtualne/abstrakcyjne członkowie

Rhino kpi

Plusy

  • Type-safe
  • Pełny zestaw funkcji
  • zachęca dobry projekt

Wady

  • Mylące API. Jest zbyt wiele różnych sposobów robienia tych samych rzeczy, a jeśli je połączysz w niewłaściwy sposób, to po prostu nie działa.
  • może jedynie mock interfejsy i wirtualne/abstrakcyjne członkowie

TypeMock Izolator

Plusy

  • Type-safe (AFAIR)
  • można drwić nic

Wady

  • Bardzo inwazyjne
  • Potencjał Vendor lock-in
  • nie zachęca Dobry projekt

NMock

Zalety

  • zachęca Dobry projekt
  • działa na każdej wersji .NET (nawet 1,1)

minusy

  • nie typu bezpieczny
  • może jedynie mock interfejsy i wirtualni/abstrakcyjni członkowie:

Należy zwrócić uwagę, że szczególnie wady i zalety związane z TypeMock są bardzo kontrowersyjne. Opublikowałem my own take on the matter on my blog.

Zacząłem od NMock, gdy była to jedyna opcja w 2003 roku, a następnie migrowałem do Rhino Mocks ze względu na jego typ bezpieczeństwa, a teraz używam Moq z powodu prostszego interfejsu API.

+2

Co do zamówionych oczekiwań w Moq: Phil Haack pokazuje miłą drogę do obejścia tego: http://haacked.com/archive/0001/01/01/moq-sequences.aspx – flq

+0

@ Mark: Czy możesz rozwinąć na swoim spostrzeżenie, że TypeMock jest bardzo inwazyjny? W jaki sposób? – BenAlabaster

+0

@ Mark: P.S. Przeczytałem twój blog na temat TypeMocka i biorąc pod uwagę argumenty podniesione przez Roya Osherove'a i twoje odpowiedzi [i nie wiedząc nic więcej na temat TypeMocka], musiałbym dojść do wniosku, że twoja argumentacja wydaje się bardziej przekonująca. – BenAlabaster

3

Do tej pory używałem RhinoMocks i Moq. Moq jest obecnie moim ulubionym ze względu na jego prostotę, która jest obecnie wszystkim, czego potrzebuję. RhinoMocks jest dość potężny, ale nigdy nie byłem w stanie w pełni go wykorzystać.

+1

Zacząłem od RhinoMocks i szybko przeniosłem się do Moq, gdy usłyszałem o tym również. Moq jest tak prosty w użyciu. – Chris

0

Być może zechcesz pamiętać, że jeśli potrzebujesz obsługi środowiska wielojęzycznego (np. VB), wszystkie konfigurowalne ramy kodu (mogę mówić do Moq i RhinoMocks bezpośrednio) będą bolesne, biorąc pod uwagę (brak) składni anonimowej delegata/lambda w VB. Będzie to bardziej możliwe w Visual Studio 2010/VB 10, ale nadal nie będzie porównywalne z ładną składnią C# lambdy.

TypeMock appears to have some support for VB

+0

Niekoniecznie potrzebuję kompatybilności z różnymi językami, choć z pewnością byłaby to dobra funkcja. To może mnie przekonać, jeśli dwie struktury byłyby bardzo podobne, ale wątpię, czy wymieniłbym je na inną przydatną funkcję. – BenAlabaster

2

Użyliśmy Rhino Mocks dla ponad rok teraz. PRO:

  • łatwo stworzyć mocks
  • może Mock publicznego i metody wewnętrznych
  • może mock interfejsy lub klas
  • mogą tworzyć mocks częściowych (szyderczy tylko konkretne metody z klasy)

PRZECIW:

  • metody muszą być co najmniej wewnętrzne i wirtualne (mogą zepsuć architekturę).
  • trudne do zastosowania w przypadku poszczególnych właściwości, szczególnie w przypadku kolekcji obiektów, które powstają wewnątrz zakresu testowego - składnia więzów jest skomplikowana.
  • musisz zachować ostrożność, gdy nagrywanie zatrzyma się, a odtwarzanie rozpocznie się
  • uważać na to, jakie połączenia są wyśmiewane (na przykład wywołanie właściwości, którego nie widzisz lub metoda, która nie była wirtualna) - błędy, które możesz uzyskać nie są zbyt pomocne

Zauważyliśmy, że używanie szokujących frameworków promuje "białe" testowanie skrzynek (szczególnie w przypadku testów jednostkowych). Skończyło się na testach, które potwierdziły, W JAKI SPOSÓB wykonano zadanie, a NIE CO ROBIĄ. Były one bezużyteczne do refaktoryzacji i musieliśmy przerobić większość z nich.

+0

Osobiście wolę testowanie stanu z próbkami pośredniczącymi w testowaniu zachowań z możliwymi do zweryfikowania próbami. Może to pomóc uniknąć delikatnych testów, które potwierdzają "jak". – TrueWill

+2

Ooh, konieczność zaprojektowania twojego kodu w celu dostosowania się do szyderczej pracy ramowej jest dla mnie zdecydowanym łamaczem transakcji. +1 za twoje spostrzeżenia na ten temat, bardzo cenne. – BenAlabaster

+1

@Ben - będziesz mieć to ograniczenie z czymkolwiek poza TypeMock. Jeśli kpisz z interfejsów, nie ma problemu. Dzięki konkretnym klasom można wyśmiewać tylko wirtualne metody. – TrueWill

2

Tak jak Frank i Chris, wypróbowałem RhinoMocks i przełączyłem na Moq. Nie byłem rozczarowany. Zobacz moją serię blogach:

EDIT: Proszę zauważyć, że generalnie zrobić badanie stanu oparte o odcinki; Rzadko testuję zachowanie przy sprawdzalnych próbach.

+0

Czy możesz wyjaśnić, co skłoniło cię do zmiany? Czy to były kłopoty z Rhino Mocks, które spowodowały, że przeskoczyłeś statek, czy to było coś, co Moq po prostu robił lepiej? – BenAlabaster

+0

@Ben - To była kombinacja kłopotliwych problemów i złożoności. Z Rhino Mocks miałem wrażenie, że walczę z biblioteką (i zawsze odwoływałem się do dokumentacji); Moq wydawał mi się bardziej naturalny. Sugerowałbym próbowanie obu i trzymanie się tego, który najbardziej pasuje do twoich idiomów. – TrueWill

+0

Dziękujemy za odnoszenie się do swoich blogów. Poszedłem wzdłuż twojej ścieżki i omówiłem niektóre dyskusje i zdecydowałem zacząć od Moqa, żeby zobaczyć, jak sobie radzę. – DaveN59

1

Nie użyłem wszystkich tych frameworków, ale spojrzałem na RhinoMocks i Moq, i poszedłem z Moq, ponieważ czuje się bardziej elegancko i znacznie prościej. Używam wersji trunkingowej, która zawiera poprawkę obowiązkową dla limitu 4 argumentów nałożonego na callbacki w najnowszym wydaniu wersji 4.0 beta.

Najbardziej podoba mi się domyślne zachowanie Moq, które nie zachowuje się tak, jak w przypadku wykonywania nieoczekiwanych połączeń, tak jak w przypadku testów Mock Object. Możesz to skonfigurować, aby tego dokonać, ale wydaje mi się, że wymaga to spędzenia zbyt wiele czasu na ustawianiu oczekiwań i niewystarczającego testowania czasu.

1

Używam TypeMock, ponieważ rozwijam się na SharePoint. Ponieważ TypeMock może kpić z niczego, okazało się to cennym zasobem, gdy jednostka testuje nasze serwery Sharepoint, odbiorniki zdarzeń, przepływy pracy itp.

Z drugiej strony TypeMock może być kosztowny, jednak dostępna jest wersja version specyficzna dla SharePoint i kosztuje mniej niż pełny pakiet TypeMock. Gorąco polecam.

Jedną z rzeczy, z którą nie zgadzam się, jest to, że TypeMock nie sprawia, że ​​projektujesz swój kod bardzo dobrze. Często tworzone przeze mnie klasy i ogólny kod są dobrze zaprojektowane. Tylko dlatego, że używam TypeMocka, nie oznacza, że ​​poświęcam jakość mojego projektu - nadal ćwiczę IoC i SRP. To, że TypeMock może kpić z niczego, nie oznacza, że ​​piszę swój kod, aby odzwierciedlić tę zdolność.