2016-10-10 63 views
0

考虑这个interace:起订量:如何使用非空发件人引发事件

public interface IFoo 
{ 
    event EventHandler SomethingHappened; 
} 

随着起订量,我使接口的模拟,现在我想提出一个事件:

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

这可以很好地工作,但问题在于订阅者希望发件人是事实(引发事件的IFoo),而不仅仅是空。

所以我想提出的事件是这样的:

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

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

+0

你什么错误?还有什么'SomethingHappened'的签名? – meJustAndrew

+0

尝试 'myMock.Raise(x => x.SomethingHappened + = null,myMock.Object,EventArgs.Empty);'。 'x => x.SomethingHappened + = null',这会告诉Mock,哪个事件要提出,休息是如预期的参数 –

回答

0

假设你正在使用.Net 4.5你的起订量的对象,有一个更改EventHandler<TEventArgs>代表的定义,请检查4.54.0的链接,这可以确保虽然您使用的是IFoo(可能无法从EventArgs分配),但编译器仍然不会像4.0中那样抱怨,但其他方面将是Moq框架将事件视为标准委托而不是事件patt ERN,需要被称为:

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

x.SomethingHappened += null,它告诉Moq的框架,事件/委托调用和其余的将是标准参数的形式object sender, EventArgs e

+0

非常感谢你的好解释:-)。是的,我正在使用.Net 4.5。 –

+0

欢迎,那么你应该关心接受正确和完整的答案。 –

0

你可以传递(对象发件人,EventArgs e)在SomethingHappened如下,这将让用户知道发送者是IFoo的

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

嘿,这是有效的 - 谢谢,男人!似乎我被null弄糊涂了。我认为null是作为发送者参数传输的,但显然并非如此。但是,null意味着什么呢?为什么需要? –

+0

您需要先了解原因,为什么会发生这种情况,如果您注意到,我会在评论中提前回复评论中的答案。检查我的答案,并怀疑你可能有任何疑问 –