2009-11-02 32 views
1

我正在使用中介模式來促進GUI對象的單元測試。使用中介模式進行單元測試 - 全部私下公開

psudo代碼示例:

Class MyGuiClass 
{ 
    //... Declare and initialize mediator to be a MyMediator 
    private void On_SomeButtonPressed() 
    { 
    mediator.SomeButtonWasPressed(); 
    } 
} 

Class MyMeditator 
{ 
    public void On_SomeButtonPressed() 
    { 
    //.. Do something now that the button was pressed 
    } 

} 

這是不錯的,因爲我現在可以進行單元測試時,而無需創建一個窗口按下SomeButton會發生什麼。

我擔心的是,我採取了一種私人的方法,並且讓任何一位調解員打電話給公衆。過去我做過這樣的事情並沒有打擾到我,因爲我沒有很多方法需要公開。

我目前正在重構一個非常大的類來使用這個模式,我想知道是否有某種方式可以控制誰可以創建MyMediator或某些方法公開的類的可見性。 (這是不可能的,甚至必要的,但我想我會問。)

(我使用C#3.0和.NET 3.5 SP1)

+1

你在這裏做的事情有時也被稱爲謙卑對象模式。不要對私人上市的東西感到不滿。 Theres我開始進行單元測試時發生了一種思維變化。我停止使用語言結構來限制如何使用代碼,並開始使用單元測試來驗證代碼的實際功能。它導致更清潔,更簡單的代碼。 – 2009-11-02 23:07:36

回答

1

問題是,你想要一個類的公共接口來顯示該類的公共'API',所以在公開私有方法的時候,你會讓這個類更容易混淆,更不'乾淨'?

你可以做幾件事: 1)想想你的中介(或卑微對象)類的「公共面孔」是什麼,並愉快地使這些方法公開。即使他們只在大會中使用 - 不屬於大會公衆面孔的一部分 - 沒關係,因爲注意到你的調解員類本身沒有被公開。所以即使它的公共方法仍然是組裝的內部。 2)你可以通過使用私有私有(然後設置程序集的InternalsVisibleTo屬性,如果你的測試類位於一個單獨的程序集中)來隱藏私有。

3)採取'黑匣子'的方法進行單元測試,從原則上來說,你永遠不需要測試私有數據,因爲它們在公共方法中調用時通過它們的使用進行測試。

3

我覺得沒關係..誰的調解員的實例,除了gui?如果有人這樣做,是否會調用該方法?如果確實如此,那麼重要嗎?難以注意到,診斷和修復錯誤?

我認爲你可以通過事件實現你正在尋找的東西:

例如

/* in the gui class (view) */ 
public event EventHandler OnButtonClicked; 

/* in the mediator */ 
public MyMediator(MyView view) 
{ 
    view.OnButtonClicked += HandleButtonClicked; 
} 

private void HandleButtonClicked(object sender, EventArgs e) 
{ 

} 
3

不確定c#,但在java中,你可以聲明一些東西作爲包級訪問(在java中通過省略訪問說明符)。我所做的是創建一個單獨的測試層次結構,它與我的包結構相似,因此爲了測試類com.a.b.c.MyClass,我將有一個測試類com.a.b.c.MyClassTest,然後它可以合法地訪問MyClass中的包訪問方法。

我並不喜歡將所有內容公開化的想法,不僅僅是因爲訪問問題,而是因爲它使界面變得混亂 - 我寧願讓類的公共界面表達它的作用是什麼如何它這樣做,這往往是我最終如果我暴露的方法,我寧願是私人的。

+0

如果有一種方法可以在C#中執行此操作,我不知道它:( – Vaccano 2009-11-02 23:37:52