2009-11-12 16 views
36

sto usando RhinoMocks, ho bisogno di stub un metodo, e sempre lo hanno restituire il terzo parametro, indipendentemente da ciò che è passato in:RhinoMocks - stub un metodo che restituisce un parametro

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

Ovviamente, non è così facile Non sempre so cosa i parms stanno per essere, ma so che ho sempre voglia di restituire il terzo uno.

+0

Non sono sicuro se questo è possibile. Potresti postare il metodo che stai provando a testare? –

+0

Il metodo restituisce una chiamata a un altro metodo da una classe statica. In sostanza la chiamata appare nel database per vedere se il primo parametro è presente, se non lo è, restituisce il terzo parametro. – Martin

+0

Questo è un pezzo di torta con Moq –

risposta

65

è possibile fornire un'implementazione per un metodo con il Do() handler:

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

Nota che TypeZ appare due volte perché è sia un tipo di argomento in ingresso e il tipo di ritorno.

+2

Impressionante, questo ha funzionato perfettamente. – Martin

+1

Questo sta usando '.Expect()' invece di '.Stub()', come nella questione. – ANeves

0

è possibile utilizzare il metodo aspetta con un callback per restituire il valore che si sta dopo. Quanto segue restituirà null.

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

Non sono sicuro se è possibile utilizzare richiamata su Stub.

6

questo ha funzionato per me:

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