[英]Raise an EventHandler<TEventArgs> event with a Moq instance
我有接口
public interface IBar
{
}
和
public interface IFoo
{
event EventHandler<IBar> MyEvent;
}
和一个班级
public class Foobar
{
public Foobar(IFoo foo)
{
foo.MyEvent += MyEventMethod;
}
private void MyEventMethod(object sender, IBar bar)
{
// do nothing
}
}
现在我想用Moq 4对这段精彩的代码进行单元测试:
[Test]
public void MyTest()
{
Mock<IFoo> foo = new Mock<IFoo>();
Mock<IBar> bar = new Mock<IBar>();
Foobar foobar = new Foobar(foo.Object);
foo.Raise(e => e.MyEvent += null, bar.Object);
}
根据我的理解,Foobar.MyEventMethod应该通过加注来调用。 发生的事情是我得到一个运行时异常,说明System.Reflection.TargetParameterCountEception {“参数计数不匹配。”}。
有趣的是:当我在单元测试中提出以下内容时:
foo.Raise(e => e.MyEvent += null, EventArgs.Empty, bar.Object);
一切都按我的意愿运作。 任何人都可以解释为什么呼叫需要三个参数?
谢谢
我假设你使用.NET 4.5。 从EventHandler<TEventArgs>
删除了类型约束 ,允许您执行以下操作:
event EventHandler<IBar> MyEvent;
其中IBar
只是一些界面 。
IN 4.0,约束限制TEventArgs
可以赋值给EventArgs
类型,您的代码将无法编译。
由于这个原因( IBar
不是从EventArgs
派生的),Moq不会将您的事件视为“对应于事件处理程序模式” ,并将其视为任何其他委托:
// Raising a custom event which does not adhere to the EventHandler pattern
...
// Raise passing the custom arguments expected by the event delegate
mock.Raise(foo => foo.MyEvent += null, 25, true);
这意味着您必须提供所有参数,包括发件人 。
第一个不起作用的原因是因为EventHandlers有2个参数(对象发送者,EventArgs args)。
当你设置嘲笑
foo.Raise(e => e.MyEvent += null, EventArgs.Empty, bar.Object);
e => e.MyEvent += null
是一个告诉Moq
要引发哪个事件的表达式,
以下2个参数是您要引发它的2个参数。
EventArgs.Empty, bar.Object
注意:如果记忆对我有用,那应该是另一种方式。
当您尝试使用1参数( bar.Object
)引发事件时, Moq
会抛出一个异常,说事件处理程序需要2,因为它使用反射来调用它。
你的第一个案例可以这样写:
public class Foo : IFoo
{
public event EventHandler<IBar> MyEvent;
public void OnMyEvent(IBar bar)
{
MyEvent(EventArgs.Empty)
}
}
这给你一个编译错误:委托'EventHandler'不带1个参数
这就是为什么你需要2个参数,就像你用以下方法调用它一样:
public class Foo : IFoo
{
public event EventHandler<IBar> MyEvent;
public void OnMyEvent(IBar bar)
{
MyEvent(this, bar);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.