2009-08-28 12 views
8

Existe-t-il un moyen avec Rhino Mocks de définir une propriété d'un Stub si une méthode est appelée.Rhino Mocks - Définit une propriété si une méthode est appelée

Quelque chose comme ceci: (Code faux en gras)

callMonitor.Expect (x => x.HangUp()). SetProperty (callMonitor.InACall = false);

La méthode HangUp renvoie void et je ne peux pas vraiment changer cela. Mais je veux que mon talon sache que l'appel a été raccroché quand HangUp est appelé.

Répondre

10

Vous pouvez utiliser la méthode "WhenCalled" pour exécuter votre propre code lors de l'appel d'un stub; assez sûr qu'il devrait fonctionner avec Mocks, aussi. Selon la documentation, WhenCalled est un remplacement/mise à jour pour Callback.

callMonitor.Expect(x => x.HangUp()) 
.WhenCalled(invocation => callMonitor.InCall = false); 

Quelques infos à la fin de ce post: http://grahamnash.blogspot.com/2008/10/rhino-mocks-35.html

+0

Encore un abus, même si le nom de la méthode a changé. WhenCalled, comme Callback, est destiné à être utilisé dans l'évaluation avancée des attentes, pour ne pas effectuer de calculs arbitraires. – tvanfosson

+0

Que recommanderiez-vous à la place? Un test roulé à la main double? –

+0

En fait, j'aimerais voir le test. Il me semble que si le test est suffisamment ciblé, il n'est peut-être pas nécessaire. – tvanfosson

1

Il pourrait y avoir certaines conditions dans lesquelles vous auriez besoin de faire cela, mais en général, je m'attendrais à ce que vous utilisiez simplement votre maquette/talon pour qu'il renvoie les bonnes valeurs en réponse à votre code. Les seules exceptions à ce que je peux penser sont des simulacres partiels où vous testez une partie d'une classe et voulez vous moquer des autres parties.

La définition d'un faux sur une propriété est assez facile.

callMonitor.Expect(x => x.HangUp()); 
callMonitor.Expect(x => x.InACall).Return(false); 

Si callMonitor est un bout, vous pouvez définir directement la propriété.

callMonitor.Stub(x => x.HangUp()); 
callMonitor.InACall = false; 
1

Oui, vous pouvez utiliser la méthode de rappel:

callMonitor.Expect(x => x.HangUp()).Callback(() => callMonitor.InCall = false); 
+0

Exactement ce que je l'aurais écrit (si j'avais rencontré cette question il y a 6 minutes;) –

+0

abus horrible du mécanisme de rappel. C'est difficile à dire, car il n'y a pas beaucoup d'infos dans le post, mais je pense que le PO n'est pas assez concentré dans les tests. Lire les mises en garde d'Ayende sur l'utilisation des rappels sur http://ayende.com/Wiki/(S(zwkmge45vdgkgvznp13mgc55))/Rhino+Mocks+Callbacks.ashx – tvanfosson

+2

FWIW - le rappel est censé être utilisé pour évaluer si l'attente était ou non rencontré, ne pas faire de calcul arbitraire. – tvanfosson

-1

Je ne suis pas expert RhinoMocks, mais je crois que cela devrait fonctionner.

SetupResult.For(callMonitor.InACall).Return(false); 
+0

Je crois que ce n'était pas ce qu'il a demandé. Il a demandé s'il existe un moyen de donner à la méthode HangUp une implémentation impromptue qui définit la propriété InCall sur false lorsque la méthode HangUp est appelée. Ce que vous avez là entraînera la méthode InACall à renvoyer false, peu importe si la méthode HangUp a été appelée ou non. –

Questions connexes