最小起订量:如何使用非空发件人引发事件

Moq: How to raise an event with non-null sender

考虑这个界面:

public interface IFoo
{
   event EventHandler SomethingHappened;
}

用Moq,我模拟了界面,现在我想引发事件:

var myMock = new Mock<IFoo>();
myMock.Raise(x => x.SomethingHappened += null, EventArgs.Empty );

这很完美,但问题是订阅者希望发送者是某个东西(实际上是引发事件的 IFoo)而不仅仅是 null。

所以我想这样发起这个事件:

myMock.Raise(x => x.SomethingHappened += myMock.Object, EventArgs.Empty );

但编译器不允许这样做 - 它似乎只接受 null 作为发件人。这是为什么?有没有办法做我真正想做的事?

您可以像下面这样为 SomethingHappened 传递 (object sender,EventArgs e),这会让订阅者知道发件人是您的 IFoo 最小起订量对象

myMock.Raise(x=>x.SomethingHappened += null,myMock.Object, EventArgs.Empty );

假设您使用的是 .Net 4.5EventHandler<TEventArgs> 委托的定义发生了变化,请检查 4.5 and 4.0 的链接,这可以确保您使用的是IFoo,可能无法从 EventArgs 分配,编译器仍然不会像在 4.0 中那样抱怨,但其他方面是 Moq 框架会将事件视为标准委托而不是事件模式,这需要被称为:

myMock.Raise(x=>x.SomethingHappened += null,myMock.Object, EventArgs.Empty);

x.SomethingHappened += null,它告诉 Moq 框架,调用哪个事件/委托,其余的将是 object sender, EventArgs e

形式的标准参数