2009-07-14 14 views
2

Mein Test versucht zu behaupten, dass eine bestimmte Dal-Methode mit einigen Parametern aufgerufen wurde. Die Methode gibt ein Objekt DataSet zurück, so dass mein Schein einfach einen leeren DataSet zurückgibt, wenn er aufgerufen wird.Mischen von Stubs und Mocks in Rhino

Das Problem, das ich habe, ist, dass, wenn das SUT nicht die Dal mit den richtigen Parametern aufrufen, der Schein wird nicht die leere DataSet zurückgeben, und meine Klasse wird eine Ausnahme beim Versuch, einen NULL-Verweis zugreifen. Dies führt nur dazu, dass der Test mit einer nicht verwandten Nachricht in meinem Test Runner fehlschlägt.

Ich möchte die Methode stub die Dataset in allen Fällen zurückgeben, so dass die Methode ordnungsgemäß ausgeführt wird, und am Ende des Tests überprüfen, dass es mit den erwarteten Parametern aufgerufen wurde. frage ich zu viel?

Antwort

2

Dies sollte es tun, vorausgesetzt, dass Ihre Methode ein int-Argument hat.

IDal dalMock = MockRepository.GenerateMock<IDal>(); 

// setup mock to return the emptyDataSet for any argument  
dalMock 
    .Stub(x => x.GetDataSet(Arg<int>.Is.Anything)) 
    .Return(emptyDataSet) 
    .Repeat.Any(); 

sut.Execute() 

// assert that the argument had been 7 
dalMock.AssertWasCalled(x => x.GetDataSet(Arg<int>.Is.Equal(7)) 

Documentation of argument constraints. (Ich schrieb dieses Kapitel, können Sie mich so fragen, ob Sie nicht verstehen ;-)


.NET 2.0 verwenden es wie folgt aussehen würde:

MockRepository mocks = new MockRepository(); 
IDal dalMock = mocks.CreateDynamicMock<IDal>(); 

// expect the correct argument 
Expect.Call(dalMock.GetDataSet(Arg<int>.Is.Equal(7))) 
    .Return(emptyDataSet) 
    .Repeat.Once(); 

// setup mock to return the emptyDataSet for any argument  
SetupResult.For(dalMock.GetDataSet(Arg<int>.Is.Anything)) 
    .Return(emptyDataSet) 
    .Repeat.Any(); 

sut.Execute() 

// assert that the argument had been 7 
mocks.VerifyAll(); 

Nicht 100% sicher, wenn es funktioniert, aber es sollte.

Sie können auch versuchen, diese:

// setup mock to return the emptyDataSet for any argument  
SetupResult.For(dalMock.GetDataSet(Arg<int>.Is.Anything)) 
    .Do((GetDataSetDelegate)delegate(int i) 
    { 
     Assert.AreEqual(7, i); 
    } 
    .Return(emptyDataSet) 
    .Repeat.Any(); 

sut.Execute() 

Do ausgeführt wird, wenn das Mock bezeichnet wird. Es erfordert einen Delegaten mit genau der gleichen Schnittstelle wie die verspottete Methode. Aus syntaktischen Gründen von .NET 2.0 müssen Sie es in den richtigen Delegattyp umwandeln, sodass Sie es zuerst deklarieren müssen (in diesem Fall GetDataSetDelegate).

Hinweis für Rhino 3.5 Benutzer: gibt es eine viel bequemere Weise aufgerufen werden: WhenCalled dauert nur ein Lambda als Argument hat aber anders umgesetzt werden.

Mit Do bzw. WhenCalled können Sie Argumentaussagen implementieren, wenn der Schein aufgerufen wird.

+0

Danke für den Tipp und Link. Also gibt es keine Möglichkeit für mich, eine Erwartung mit Argumenten zu setzen, und einen Stub mit "alles andere"? Da ich .NET 2.0 auf VS2005 verwende, kann ich keine Lambda- und Erweiterungsmethoden verwenden, die alles so viel hässlicher machen, dass ich die Verwendung minimieren möchte. –

+0

Sie können die alte Syntax verwenden. Ich versuche es der Antwort hinzuzufügen. –

+0

Im Moment verwende ich die AAA-Syntax. Ich verwende einfach RhinoMocksExtensions.Stub (dal, Delegat . Is.Anything); }).Rückgabe (neues DataSet()); Aber ich denke, ich werde einfach machen die Dal immer stub die Methode, und fügen Sie dann die Erwartung als "AssertWasCalled" wie Sie vorgeschlagen. Danke nochmal. –

-2

Haben Sie versucht, Teilmocks mit Rhino Mocks wie beschrieben here zu verwenden. Ich denke, wenn du das tust, wirst du bekommen, was du willst.

+0

Das Verwenden von partiellen Mocks ist eine sehr SCHLECHTE Idee: Sie sollten nur verwendet werden, wenn Sie etwas verspotten müssen, das keine Schnittstelle hat und nicht unter Ihrer Kontrolle steht - mit anderen Worten, wenn Sie ziemlich verzweifelt sind. –

+0

Ich habe nie gesagt, dass es eine gute Idee war. es war eine Idee für ein Problem, das er hatte. Also, was ist deine bessere Idee? – AutomatedTester