2012-10-01 106 views
1

我有一個事件並且如下面一個起毛方法事件預期不提高是提高

public class Events { 

    public event EventHandler<CustomEventArgs> Succeed; 

    public virtual void OnSucceed(object sender, params object[] data) 
    { 
     CustomEventArgs args = new CustomEventArgs(data); 

     EventHandler<CustomEventArgs> _succeed = Succeed; 

     if (_succeed != null) 
     { 
      _succeed(sender, args); 
     } 

    }} 

我已經創建了一個單元測試OnSucceed法(使用FluentAssertions) :

[Test] 
    public void SucceedShouldNotBeRaisedTest() 
    { 
     Events events = new Events(); 

     events.MonitorEvents(); 

     events.OnSucceed(this,"somedata"); 

     events.ShouldNotRaise("Succeed"); 
    } 

由於沒有用戶的事件,那麼我希望它不會提高e成功事件

但測試失敗,因爲成功事件被提出。這有什麼問題?!

回答

1

當您撥打events.MonitorEvents();FluentAssertions會自動訂閱公共事件以檢測事件何時發生。

由於您的病情始終評估爲trueif (_succeed != null),因此您的測試失敗。測試時,該事件將永遠是不同null

現在我想向您推薦以下按喬恩斯基特建議的方法:

public event EventHandler<CustomEventArgs> Succeed = delegate { } ; 

通過上述事件聲明,您的事件將永遠不會null(事件不能從它的類

注外)分配:您可以分配委託事件背後同級車像這裏面空:

this.Succeed = null; 

上面的語句是分配事件背後的委託爲空,而不是事件本身。通常你不需要做這樣的事情,但如果你這樣做,你就必須重新初始化事件是這樣的:

this.Succeed = null; 
this.Succeed = delegate { }; 

如果你遵循這些建議,您的事件將永遠不會爲空,你不需要調用if(this.MyEvent != null)條件來提高你的事件了。 (請注意,這種情況是完全的技術和它不相關的領域本身。)

現在你已經刪除了技術條件可以實際上集中在域規則決定何時引發事件。

最後一步是刪除:if (_succeed != null)並添加條件,其表示如果事件應該或不應該根據當前域

if(shouldRaiseEvent) 
{ 
    EventHandler<CustomEventArgs> _succeed = Succeed; 

    _succeed(...); 
} 

對於你的測試提出了,你只需要配置你的主題根據所需條件進行測試,以提高或不提高您的活動。

全樣本:

public class Events { 

public event EventHandler<CustomEventArgs> Succeed = delegate { }; 

public virtual void OnSucceed(object sender, params object[] data) 
{ 
    if (/*[optional] here your domain condition that will indicate if the event should be raised*/) 
    { 
     // this is a best practice to deal with multi-threading situations 
     var _succeed = this.Succeed; 
     var args = new CustomEventArgs(data); 

     _succeed(sender, args); 
    } 

} 
} 
+0

謝謝主席先生,然後分配空語句是首選?實際上第一個人感覺更好(event = delegate {}) –

+0

我剛剛編輯了答案 – Jupaol