2009-03-16 10 views
9

Jestem nowy w kpiach i decyduję się na fałszywe ramy. W Moq home cytatyKpiny z wykorzystaniem "tradycyjnego" modelu Record/Replay vs Moq

Obecnie jest to tylko szyderczy biblioteka, która wykracza przeciwko uogólnionych i nieco nieintuicyjne (szczególnie dla początkujących) Zapis/Odpowiedz podejścia od wszystkich innych ram.

Czy ktoś może wyjaśnić, czym jest podejście Record/Replay i jak różni się Moq? Jakie są plusy i minusy każdej z nich, zwłaszcza z punktu widzenia wyboru ramy?

Dzięki.

Odpowiedz

7

Podejście Record/Replay jest obsługiwane przez RhinoMocks. Podstawową ideą jest to, że twoje wykonanie testu jest podzielone na dwie fazy, fazę rekordową i fazę odtwarzania. Żeby być trochę bardziej konkretnym

var repo = new MockRepository(); 
var dependency = repo.DynamicMock<IDependency>(); 
With.Mocks(repo).Expecting(delegate { 
     Expect.Call(dependency.AMethod(1)).Return(result);      
     }).Verify(delegate { 
     var sut = new Sut(wrappee); 
     sut.DoStuffThatCallsAMethod(); 
     Assert.IsTrue(sut.ResultState); 
     }); 

Tak więc blok oczekiwany jest fazą Record, a blok Verify jest fazą powtórki.

MOQ wariant tego kodu byłoby

var dependency = new Mock<IDependency>(); 
dependency.Expect(dep => dep.AMethod(1)).Returns(result);   
var sut = new Sut(wrappee.Object); 
sut.DoStuffThatCallsAMethod(); 
Assert.IsTrue(sut.ResultState); 

Które jak widać jest znacznie ładniejszy czytać. Kiedyś używałem RhinoMocks, ale odkąd odkryłem Moq używam tylko Moq. Uważam, że jest to o wiele bardziej czytelny kod. Tak więc moją radą byłoby pójść na Moq.

+8

Ta odpowiedź nie ma sensu do mnie. Oczywiście, wariant Moq jest prostszy, ale nadal masz te dwie fazy w teście: linia 2 (z wywołaniem "Expect") należy do fazy "record", podczas gdy linie 3 i 4 należą do fazy "powtórki" . Nie uważam, że zwykłe różnice w składni są kluczowe dla tego, czym jest "rekord/powtórka". –

0

Od razu nagrałem/nagrałem, ponieważ trudno jest zobaczyć w konfiguracji, co jest upięte/wyśmiewane lub po prostu uruchamia kod. Wierzę, że Rhino ma wiele sposobów pracy. W szczególności można użyć bloku using(), aby odizolować konfigurację od innych połączeń.

1

RhinoMocks jest w rzeczywistości bardzo wszechstronny, można użyć dowolnego podejścia. RhinoMocks wygląda nieco lepiej niż Moq w stylu oczekiwania/weryfikacji. Jednak nawet fakt, że możesz użyć tego stylu, jest pochowany w dokumentacji (ostatni raz kiedy patrzyłem). Wybraliśmy Moq na RhinoMocks w moim bieżącym projekcie, ponieważ nie zdawaliśmy sobie sprawy, że to konfiguruje/weryfikuje.

Składnia zapisu/odtwarzania daje możliwość zmiany wartości, którą metoda zwróci podczas kolejnych wywołań tej metody. Czasami może się to przydać. Powiedziawszy to, potrzeba tego jest często zapachem, że twój projekt nie jest w porządku. Jest to przydatne, gdy możesz zobaczyć, co jest nie tak i musisz iść dalej.

Moq ma możliwość zmiany wartości, ale jest to nieco niezgrabne (z dokumentacją)

// returning different values on each invocation 
var mock = new Mock<IFoo>(); 
var calls = 0; 
mock.Setup(foo => foo.GetCountThing()) 
.Returns(() => calls) 
.Callback(() => calls++);