2012-10-22 2 views
5

mit einer SchnittstelleMocking Eventhandler

public interface IHandlerViewModel { 
     EventHandler ClearInputText { get; } 
} 

Ich möchte testen definiert, wenn ClearInputText durch eine Methode aufgerufen wird. Dazu mache ich so etwas wie dieses

SomeType obj=new SomeType(); 
bool clearCalled = false; 
var mockHandlerViewModel=new Mock<IHandlerViewModel>(); 
mockHandlerViewModel.Setup(x => x.ClearInputText).Returns(delegate { clearCalled = true; }); 

obj.Call(mockHandlerViewModel.Object);//void Call(IHandlerViewModel); 
Assert.IsTrue(clearCalled); 

, die fehlschlägt. Einfach der Delegat wird nicht angerufen. Bitte helfen Sie mir dabei.

+2

delegate {copyCalled = true;} -> Delegieren {clearCalled = true;} –

+0

fügen Sie Code hinzu, in dem Sie tatsächlich Ereignishandler aufrufen –

Antwort

8

Das von Ihnen angegebene Beispiel ist nicht eindeutig. Du prüfst im Wesentlichen deinen eigenen Spott.

In einem Szenario, in dem der mokierte Proxy als Abhängigkeit von einem zu testenden Objekt übergeben wird, richten Sie den Ereignishandler nicht ein, Sie heben ihn auf.

var mockHandlerViewModel = new Mock<IHandlerViewModel>(); 
var objectUnderTest = new ClassUnderTestThatTakesViewModel(mockHandlerViewModel.Object); 
// Do other setup... objectUnderTest should have registered an eventhandler with the mock instance. Get to a point where the mock should raise it's event.. 

mockHandlerViewModel.Raise(x => x.ClearInputText += null, new EventArgs()); 
// Next, Assert objectUnderTest to verify it did what it needed to do when handling the event. 

Mocks entweder die Ereignisquelle ersetzen durch Verwendung .Raise(), oder sie ersetzen ein Objekt, das eine andere Klasse im Test Veranstaltung verbrauchen (zu behaupten, das Ereignis ausgelöst wurde), in dem Fall, dass Sie .Callback verwenden () um "handling" das Ereignis in einer lokalen Flag-Variable aufzuzeichnen.