2014-09-26 18 views
6

Come per deridere il seguente metodo:Moq. Esegui Azione dato come parametro

public class TimeService : ITimeService 
{ 
    public void SetDelyEvent(int interval, bool reset, Action action) 
    { 
     var timer = new Timer {Interval = interval, AutoReset = reset}; 
     timer.Elapsed += (sender, args) => action(); 
     timer.Start(); 
    } 
} 

voglio chiamare la data azione.

var stub = new Mock<ITimeService>(); 
stub .Setup(m => m.SetDelyEvent(100, false, ACTION)); 
+0

Sei voler l'azione passata eseguita immediatamente non appena la chiamata di funzione viene eseguita solo una volta, o stai cercando di "ricreare" il comportamento di TimeService all'interno Moq? –

+0

Voglio chiamare l'azione una volta immediatamente. Questa azione è un metodo privato nel mio SUT. Devo chiamarlo per produrre un risultato. –

risposta

9

Basta utilizzare il metodo .Callback( per richiamare un metodo che verrà eseguito all'avvio del esegue finto, la funzione di callback possono essere passati in azione che è stato passato al tuo metodo originale, tutto quello che dovete fare è eseguire l'azione nel tuo callback.

var stub = new Mock<ITimeService>(); 
    stub .Setup(m => m.SetDelyEvent(It.IsAny<int>(), It.IsAny<bool>(), It.IsAny<Action>())) 
     .Callback((int interval, bool reset, Action action) => action()); 
+0

Eccellente. Solo che ACTION deve essere 'It.IsAny ()' –

+0

Va bene, non ha effetto sulla soluzione, ho usato solo 'ACTION' perché pensavo che fosse una variabile che hai dichiarato. Il codice funzionerà altrettanto bene con 'm.SetDelyEvent (It.IsAny (), It.IsAny (), It.IsAny ())', è ancora possibile utilizzare lo stesso callback. –

+0

@MiroslavPopov Ho aggiornato il codice per utilizzare le proprietà al posto di quelle definite nell'esempio originale. –

Problemi correlati