c# - 模拟事件处理器

标签 c# delegates mocking moq assert

定义接口(interface)

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

失败了。只是不调用委托(delegate)。 请帮我解决这个问题。

最佳答案

你举的例子不清楚。您实际上是在测试自己的模拟。

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

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() 来记录“在局部标志变量中处理”事件。

关于c# - 模拟事件处理器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13020511/

相关文章:

c# - 使用 Telerik 组件正确部署应用程序

c# - 如何在没有 SMTP 端口、托管和启用 SSL 的情况下发送电子邮件?

ruby-on-rails - Ruby 委托(delegate)/代理

c# - 将具有两个参数的委托(delegate)作为参数函数传递

c# - 如何禁用 ToolStripButton?

c# - 如何获取本地化版本的windows内置 'Network Service'账号?

ios - 从另一个类更新 UILabel

angular - 是否可以模拟 typescript 装饰器?

Junit VerificationModeFactory.times() 与mockito.times()

c# - 使类可测试