Moq:如何使用非null发件人引发事件

时间:2016-10-10 16:35:56

标签: c# events moq raise

考虑这个interace:

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作为发件人。这是为什么?有办法做我真正想要的吗?

2 个答案:

答案 0 :(得分:0)

你可以传递(对象发送者,EventArgs e)SomethingHappened,如下所示,这将让订阅者知道发件人是你的IFoo的moq对象

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

答案 1 :(得分:0)

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

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

x.SomethingHappened += null,告诉Moq框架,调用和休息的事件/委托将是object sender, EventArgs e

形式的标准参数