2009-08-28 23 views
8

¿Hay alguna manera con Rhino Mocks de establecer una propiedad de un Stub si se llama a un método?Rhino Mocks: establezca una propiedad si se llama un método

Algo como esto: (Código falso en negrita)

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

El método HangUp devuelve vacío y realmente no puedo cambiar eso. Pero quiero que mi stub sepa que la llamada se colgó cuando se llama a HangUp.

Respuesta

10

Puede utilizar el método "WhenCalled" para ejecutar su propio código cuando se llama a un stub; bastante seguro de que debería funcionar con Mocks, también. De acuerdo con la documentación, WhenCalled es un reemplazo/actualización para Callback.

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

Algo de información al final de este post: http://grahamnash.blogspot.com/2008/10/rhino-mocks-35.html

+0

Sigue siendo un abuso, a pesar de que el nombre del método ha cambiado. WhenCalled, como Callback, está destinado a utilizarse en la evaluación de expectativas avanzada, no para realizar cálculos arbitrarios. – tvanfosson

+0

¿Qué recomendarías en su lugar? ¿Una prueba doble rodada a mano? –

+0

En realidad, me gustaría ver la prueba. Me parece que si la prueba se enfoca lo suficiente, es posible que no la necesite. – tvanfosson

1

Puede que existan algunas condiciones bajo las cuales tendría que hacer esto, pero generalmente esperaría que simplemente instrumentara su simulacro para que devuelva los valores correctos en respuesta a su código. Las únicas excepciones a esto que puedo pensar son burlas parciales en las que estás probando una parte de una clase y quieres burlarte de las otras partes.

Establecer un simulacro en una propiedad es bastante fácil.

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

Si callMonitor es un esbozo, entonces se puede establecer directamente la propiedad.

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

, se puede utilizar el método dede devolución de llamada:

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

Exactamente lo que yo he escrito (si hubiera encontrado con esta pregunta hace 6 minutos;) –

+0

horrible abuso del mecanismo de devolución de llamada. Es difícil de decir, ya que no hay mucha información en el post, pero creo que el OP no se está enfocando lo suficiente en las pruebas. Lea las advertencias de Ayende sobre el uso de devoluciones de llamadas en http://ayende.com/Wiki/(S(zwkmge45vdgkgvznp13mgc55))/Rhino+Mocks+Callbacks.ashx – tvanfosson

+2

FWIW: se supone que la devolución de llamada se debe usar para evaluar si la expectativa era o no se reunió, no para hacer cálculos arbitrarios. – tvanfosson

-1

No soy un experto RhinoMocks, pero creo que esto debería funcionar.

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

Creo que eso no fue lo que preguntó. Preguntó si hay una forma de darle al método HangUp una implementación improvisada que establezca la propiedad InCall como falsa cuando se llame al método HangUp. Lo que tenga allí hará que el método InACall devuelva falso, no importa si se llamó o no al método HangUp. –

Cuestiones relacionadas