模拟 EventHandler

6

定义了一个接口

 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;} - Hamlet Hakobyan
请在您实际调用事件处理程序的地方添加代码 - petro.sidlovskyy
1个回答

17

您提供的示例不够清晰。本质上,您正在测试自己的模拟。

在将模拟的代理作为被测对象的依赖项传递的情况下,您无需设置事件处理程序,而是引发它。

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.

Mock对象可以通过使用.Raise()替换事件来源,或者它们可以替换另一个将消费正在进行测试的类的事件的对象(以断言事件已被触发),这种情况下您可以使用.Callback()来记录在本地标记变量中“处理”事件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接