2009-03-16 12 views
9

Ich bin neu bei Mocks und entscheide mich für ein Mock-Framework. Die Moq home ZitateMocking mit 'traditionellen' Record/Replay vs Moq-Modell

Derzeit ist es die einzige spöttische Bibliothek, die gegen die verallgemeinern und etwas unintuitive (vor allem für Anfänger) Record/Antworten Ansatz von allen anderen Frameworks geht.

Kann mir jemand einfach erklären, was der Record/Replay-Ansatz ist und wie sich Moq unterscheidet? Was sind die Vor- und Nachteile eines jeden Einzelnen, besonders im Hinblick auf die Festlegung eines Rahmens?

Danke.

Antwort

7

Der Record/Replay-Ansatz wird von RhinoMocks unterstützt. Die Grundidee besteht darin, dass Ihre Testausführung in zwei Phasen unterteilt ist, die Aufzeichnungsphase und die Wiederholungsphase. ein wenig mehr Beton ist

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); 
     }); 

So ist die Erwartung der Block zu sein die Aufnahmephase und der ist Überprüfen Block die Replay-Phase.

würde theMOQ Variante dieses Codes sein

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); 

die, wie Sie viel schöner sehen zu lesen ist. Ich habe früher RhinoMocks benutzt, aber seit ich Moq entdeckt habe, benutze ich nur Moq. Ich finde es viel besser lesbaren Code zu produzieren. Mein Rat wäre also, nach Moq zu gehen.

+8

Diese Antwort nicht viel Sinn für mich. Sicher, die Moq-Variante ist einfacher, aber Sie haben immer noch diese beiden Phasen im Test: Zeile 2 (mit dem Aufruf von "Expect") gehört zur "Record" -Phase, während die Zeilen 3 und 4 zur "Replay" -Phase gehören . Ich glaube nicht, dass Unterschiede in der Syntax für das "Aufnahme/Wiedergabe" -Modell wesentlich sind. –

0

Ich habe Record/Replay nicht richtig gemacht, weil es im Setup schwierig zu sehen ist, was stubbed/mocked oder nur Code ausgeführt wird. Ich glaube, dass Rhino mehrere Arbeitsweisen hat. Insbesondere können Sie einen Block verwenden, um das Setup von anderen Anrufen zu isolieren.

1

RhinoMocks ist eigentlich sehr vielseitig, Sie können beide Ansatz verwenden. RhinoMocks sieht etwas besser als Moq unter dem expect/verify-Stil aus. Aber selbst die Tatsache, dass Sie diesen Stil verwenden können, ist in der Dokumentation vergraben (das letzte Mal, als ich geschaut habe). Wir haben Moq über RhinoMocks in meinem aktuellen Projekt ausgewählt, weil wir nicht erkannt haben, dass es eingerichtet/verifiziert wird.

Die Record/Replay-Syntax gibt Ihnen die Möglichkeit, den Wert zu ändern, den eine Methode bei nachfolgenden Aufrufen an diese Methode zurückgibt. Dies kann manchmal nützlich sein. Allerdings ist es oft ein Geruch, dass Ihr Design nicht richtig ist. Es ist jedoch nützlich, wenn Sie sehen können, was falsch ist, und Sie müssen weitermachen.

Moq hat die Fähigkeit haben, den Wert zu ändern, aber es ist etwas klobig (aus der Dokumentation)

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