2012-10-22 53 views
5

在定義的接口嘲諷事件處理程序

public interface IHandlerViewModel { 
     EventHandler ClearInputText { get; } 
} 

我想測試是否ClearInputText是由一些方法調用。 這樣做我做這樣的事情

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

其中失敗。只是代表不被調用。 請幫我這個。

+2

委託{copyCalled = true;} - >委託{clearCalled = true;} –

+0

請在實際調用事件處理函數的地方添加代碼 –

回答

8

你給出的例子不清楚。你基本上正在測試你自己的模擬。

在將模擬代理作爲依賴項傳遞給被測對象的情況下,您不會設置事件處理函數,而是將其提升。

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. 

嘲笑或者通過使用.Raise()替代事件源,或它們的替代物,這將消耗下測試的事件另一個類(斷言引發事件),在這種情況下使用.Callback( )在本地標誌變量中記錄「處理」事件。