2016-10-10 60 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

您需要先了解原因,爲什麼會發生這種情況,如果您注意到,我會在評論中提前回複評論中的答案。檢查我的答案,並懷疑你可能有任何疑問 –