模拟EventHandler

alg*_*mus 5 c# delegates assert moq mocking

定义了一个接口

 public interface IHandlerViewModel {
         EventHandler ClearInputText { get; } 
}
Run Code Online (Sandbox Code Playgroud)

我想测试一些方法是否调用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);
Run Code Online (Sandbox Code Playgroud)

哪个失败了.只是代表没有被调用.请帮我解决一下这个.

Ste*_* Py 12

你给出的例子不清楚.你实际上是在测试你自己的模拟.

在模拟代理作为依赖项传递给被测试对象的情况下,您不会设置事件处理程序,而是将其提升.

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.
Run Code Online (Sandbox Code Playgroud)

模拟使用.Raise()替换事件源,或者它们替换将在测试事件下使用另一个类的对象(断言事件被引发),在这种情况下,您使用.Callback()来记录"处理"本地标志变量中的事件.