2012-10-22 18 views
5

Dopo aver definito un'interfacciaMocking EventHandler

public interface IHandlerViewModel { 
     EventHandler ClearInputText { get; } 
} 

desidero verificare se ClearInputText viene richiamato da un metodo. Per fare in modo che faccio qualcosa di simile

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

che non riesce. Semplicemente il delegato non viene chiamato. Per favore aiutatemi con questo.

+2

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

+0

si prega di aggiungere il codice in cui si sta effettivamente chiamando gestore di eventi –

risposta

8

L'esempio fornito non è chiaro. Stai essenzialmente testando la tua simulazione.

In uno scenario in cui il proxy fittato viene passato come dipendenza da un oggetto sottoposto a test, non si imposta il gestore eventi, si aumenta.

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 o sostituire l'origine evento utilizzando .Raise(), oppure sostituire un oggetto che consumerà un'altra classe in caso di prova (ad affermare l'evento è stata sollevata), nel qual caso si utilizza .Callback () per registrare "gestire" l'evento in una variabile flag locale.