2011-02-25 114 views
2

我一直在使用模式一段時間。我想知道我是否做對了。我有一個監聽事件的控制器類,並在引發事件時執行私有方法。它會有點像這樣:單元測試事件觸發行爲

public class MyController 
{ 

    public MyController(IMyEventRaiser eventRaisingObject) 
    { 
     eventRaisingObject.MyEvent += HandleEvent; 
    } 

    private void HandleEvent(object sender, EventArgs args) 
    { 
     // SOME STUFF I WANT TO TEST!! 
    } 
} 


public class EventRaisingClass : IMyEventRaiser 
{ 
    public event EventHandler<EventArgs> MyEvent; 
} 

來測試MyController.HandleEvent代碼的唯一方法是創建一個存根:IMyEventRaiser是提高了代碼。

我不確定這個設計是否合適。一方面,我想保持HandleEvent方法是私人的,以便說明只有一個事件可以觸發它。另一方面,私有方法包含關鍵的業務邏輯,所以我覺得它應該是公開的或者至少是內部的,這也使得單元測試更容易。

你很多想什麼?

問候, 莫滕

+0

你在做什麼沒有什麼不妥。一個評論雖然:你可能需要一個*模擬*,甚至一個*假*,而不是*存根*。通常情況下,存根不會做任何事情,也不會觸發任何事件。 – 2011-02-25 09:22:13

+0

爲什麼不使用私有訪問器(即反射)來像測試其他私有方法一樣測試私有方法? – Massif 2011-02-25 09:15:31

+0

這對我來說是一個未知的程序。一定會看看它:-) – Morten 2011-02-25 09:18:05

回答

6

什麼你已經有了聽起來像(輕度)違反SRP。您的控制器既響應事件,又保存針對特定事件執行的複雜邏輯。如果您的控制器僅僅是將必要的數據發送到一個專門的處理器來完成真正的工作,該怎麼辦?該處理器的方法必須是公開的 - 因此可以測試! TDD如何指出SRP違規是不是很好?

+1

啊,所以你說我同時控制和調解?而我應該考慮將兩者分開,在那裏控制部分 - 我現在用一種私人方法執行 - 應該屬於它自己的一類? – Morten 2011-02-25 14:06:52

+0

可能如此。我說這是值得考慮的分裂。 – 2011-02-25 14:41:09

2

你有沒有看着嘲諷框架? 「起訂量」支持從嘲笑型引發一個事件:

Mock<IMyEventRaiser> mock = new Mock<IMyEventRaiser>() 
mock.Raise(e => e.MyEvent, EventArgs.Empty); 
+0

是的,這就是我所做的。但是你怎麼看待這個模式呢? :-) – Morten 2011-02-25 09:19:07

+0

@Morten我通常不喜歡依賴一個事件被觸發,但是你的實現看起來很好,而且是完全合法的。 – 2011-02-25 09:27:36