2009-08-28 5 views
8

C'è un modo con Rhino Mocks per impostare una proprietà di uno stub se viene chiamato un metodo.Rhino Mocks - Imposta una proprietà se viene chiamato un metodo

Qualcosa di simile a questo: (Codice falso in grassetto)

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

Il metodo HangUp restituisce void e non posso davvero cambiarlo. Ma voglio che il mio stub sappia che la chiamata è stata bloccata quando è stato chiamato HangUp.

risposta

10

È possibile utilizzare il metodo "WhenCalled" per eseguire il proprio codice quando viene chiamato uno stub; sono sicuro che dovrebbe funzionare anche con Mocks. Secondo la documentazione, WhenCalled è un sostituto/aggiornamento per il callback.

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

Alcune informazioni alla fine di questo post: http://grahamnash.blogspot.com/2008/10/rhino-mocks-35.html

+0

Ancora un abuso, anche se il nome del metodo è cambiato. Quando chiamato, come Callback, è destinato ad essere utilizzato nella valutazione delle aspettative avanzate, non a fare calcoli arbitrari. – tvanfosson

+0

Cosa consiglieresti invece? Un test arrotolato a mano doppio? –

+0

In realtà, mi piacerebbe vedere il test. Mi sembra che se il test è focalizzato abbastanza, potrebbe non esserci la necessità. – tvanfosson

1

Potrebbero esserci alcune condizioni in base alle quali dovresti farlo, ma in genere mi aspetterei che tu possa semplicemente strumentare il tuo mock/stub in modo che restituisca i valori corretti in risposta al tuo codice. Le uniche eccezioni a ciò a cui posso pensare sono le porche parziali in cui stai testando una parte di una classe e vuoi prendere in giro le altre parti.

Impostare una simulazione su una proprietà è piuttosto semplice.

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

Se callMonitor è uno stub, quindi è possibile impostare direttamente la proprietà.

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

, è possibile utilizzare il richiamata metodo:

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

Esattamente quello che avrei scritto (avevo mi imbatto in questa domanda 6 minuti fa;) –

+0

l'abuso orribile del meccanismo di callback. È difficile da dire, dal momento che non ci sono molte informazioni nel post, ma penso che l'OP non sia abbastanza focalizzato nei test. Leggi le precauzioni di Ayende sull'uso dei callback su http://ayende.com/Wiki/(S(zwkmge45vdgkgvznp13mgc55))/Rhino+Mocks+Callbacks.ashx – tvanfosson

+2

FWIW - si suppone che il callback venga utilizzato per valutare se l'aspettativa è stata o meno incontrato, non fare calcoli arbitrari. – tvanfosson

-1

Non sono un esperto RhinoMocks, ma credo che questo dovrebbe funzionare.

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

Credo che non fosse quello che chiedeva. Ha chiesto se c'è un modo per dare al metodo HangUp un'implementazione improvvisata che imposta la proprietà InCall su false quando viene chiamato il metodo HangUp. Quello che hai lì farà sì che il metodo InACall restituisca false indipendentemente dal fatto che il metodo HangUp sia stato chiamato o meno. –