2009-11-12 14 views
36

ich RhinoMocks verwende, brauche ich eine Methode, um Stummel, und haben sie immer den dritten Parameter zurückgeben, unabhängig davon, was in übergeben wird:RhinoMocks - Stub eine Methode, die einen Parameter Gibt

_service.Stub(x => x.Method(parm1, parm2, parm3)).Return(parm3); 

es ist offensichtlich, ist nicht so einfach. Ich weiß nicht immer, was die Parms sein werden, aber ich weiß, dass ich immer den 3. zurückgeben will.

Func<TypeX,TypeY,TypeZ,TypeZ> returnThird = (x,y,z) => z; 
mock.Expect(x => x.Method(null, null, null)).IgnoreArguments().Do(returnThird); 

Beachten Sie, dass TypeZ erscheint zweimal, weil es sowohl ein Eingabeargument Typ und der Rückgabetyp ist:

+0

Ich bin nicht sicher, ob dies möglich ist. Können Sie die Methode posten, die Sie testen möchten? –

+0

Die Methode gibt einen Aufruf einer anderen Methode aus einer statischen Klasse zurück. Im Prinzip sucht der Aufruf in der Datenbank, ob der erste Parameter vorhanden ist. Ist dies nicht der Fall, wird der dritte Parameter zurückgegeben. – Martin

+0

Dies ist ein Stück Kuchen mit Moq –

Antwort

65

Sie können eine Implementierung für ein Verfahren mit dem Do() handler bereitzustellen.

+2

Super, das hat perfekt funktioniert. – Martin

+1

Dies verwendet '.Expect()' anstelle von '.Stub()' wie in der Frage. – ANeves

0

Sie könnten die Methode expect mit einem Callback verwenden, um den gewünschten Wert zurückzugeben. Der folgende Code gibt null zurück.

_service.Expect(o => o.Method(null, null, null)) 
     .Callback((object parm1, object parm2, object parm3) => { return parm3; }); 

Ich bin mir nicht sicher, ob Sie Callback on Stub verwenden können.

6

Das ist für mich gearbeitet:

 _service 
      .Stub(x => x.Method(Arg<string>.Is.Anything, ...)) 
      .Return(null) // ... or default(T): will be ignored but RhinoMock requires it 
      .WhenCalled(x => 
      { 
       // This will be used as the return value 
       x.ReturnValue = (string) x.Arguments[0]; 
      });