2014-09-26 10 views
6

Wie die folgende Methode verspotten:Moq. Führen Sie Aktion als Parameter angegeben

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(); 
    } 
} 

ich die gegebene Aktion aufgerufen werden soll.

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

Willst du die Aktion übergeben sofort ausgeführt, sobald der Funktionsaufruf nur einmal ausgeführt wird, oder versuchen Sie, das Verhalten von TimeService in Moq "neu zu erstellen"? –

+0

Ich möchte die Aktion sofort aufrufen. Diese Aktion ist eine private Methode in meinem SUT. Ich muss es anrufen, um ein Ergebnis zu erzielen. –

Antwort

9

einfach die .Callback( Methode verwenden, um eine Methode aufzurufen, die ausgeführt wird, wenn Ihr Mock ausgeführt wird, können Ihre Callback-Funktion in der Aktion übergeben werden, die sich in Ihrem ursprünglichen Methode übergeben wurde, alles, was Sie tun müssen, ist ausführen die Aktion in Ihrem Rückruf.

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

Ausgezeichnet. Nur diese Aktion muss 'It.IsAny ()' –

+0

Das ist in Ordnung, es wirkt sich nicht auf die Lösung, ich habe nur 'ACTION' verwendet, weil ich dachte, es war eine Variable, die Sie deklariert haben. Der Code wird genauso gut tun 'm.SetDelyEvent (It.IsAny (), It.IsAny (), It.IsAny ())', können Sie immer noch den gleichen Rückruf verwenden. –

+0

@MiroslavPopov Ich habe den Code aktualisiert, um die beliebigen Eigenschaften anstelle der definierten zu verwenden, die Sie in Ihrem ursprünglichen Beispiel verwendet haben. –