2010-07-21 8 views
3

Puis-je configurer un objet fantaisie pour toujours retourner l'objet donné en paramètre? J'ai une méthodePuis-je configurer un simulacre pour toujours retourner l'objet donné dans l'un des arguments?

public MyObject DoSomething(MyObject obj) 

et je veux avoir une maquette qui retourne toujours obj pour chaque appel à DoSomething, un peu comme ceci:

mock.Stub(x=>x.DoSomething(Arg<MyObject>.Is.Anything).Return(Arg<MyObject>) 

bien que je ne suis pas sûr de ce qu'il faut mettre dans le bit de retour ...

EDIT: J'ai essayé ceci:

MyObject o=null; 
mock.Stub(x=>x.DoSomething(Arg<MyObject>.Is.Anything).WhenCalled (y=> 
{ 
    o = y.Arguments[0] as MyObject; 
}).Return (o); 

qui semblait être il pourrait être prometteur mais pas de chance. Affichage dans le cas où il pulse la mémoire de quelqu'un ...

Répondre

7

Cela devrait faire ce que vous recherchez:

mock.Stub(x => x.DoSomething(null)) 
    .IgnoreArguments() 
    .WhenCalled(x => 
        { 
         x.ReturnValue = (MyObject) x.Arguments[0]; 
        }) 
    .Return(null) 
    .TentativeReturn(); 

Fondamentalement, j'utilise WhenCalled pour remplacer la valeur de retour par défaut de null (que j'ai marqué comme une valeur provisoire) avec la valeur du paramètre qui a été passé dans DoSomething.

+0

fantastique! merci, je savais que ça devait être possible. –

+0

Que fait .TentativeReturn()? – Grzenio

+0

Pas de problème, Sam. C'était amusant de sortir du puzzle. @Grzenio: TentativeReturn signale simplement que la valeur de retour peut être remplacée. Le code ci-dessus renverra null si vous le supprimez. (WhenCalled sera toujours exécuté, mais la nouvelle valeur de retour ne sera pas honorée) –

1

Une façon plus simple:

var mock = MockRepository.GenerateStub<IFoo>(); 
mock.Expect(m => m.Bar()) 
    .Return("Result goes here") 
    .Repeat.Any();