[英]Unit Testing with the Mediator Pattern - All Private to Public
我正在使用中介者模式來促進GUI對象的單元測試。
偽代碼示例:
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結合使用)
我認為這沒有關系。除了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)
{
}
不確定c#,但是在Java中,您可以將某些內容聲明為包級訪問(在Java中,通過省略訪問說明符)。 我要做的是創建一個與我的包結構相似的單獨的測試層次結構,因此要測試com.abcMyClass類,我將擁有一個測試類com.abcMyClassTest,然后可以合法地訪問MyClass中的包訪問方法。
我沒有那么多喜歡做的一切公共的想法不僅是因為准入問題,而是因為它雜波了界面-我寧願類的公有接口表達它做什么 ,而不是它是怎么做的,這如果我公開我更願意私有的方法,那通常是我最終的歸宿。
關鍵是,您希望一個類的公共接口顯示該類的公共“ API”,因此在公開私有方法時,您是在使該類更加混亂並且減少“干凈”嗎?
您可以做一些事情:1)仔細考慮調解員(或卑微對象)類的“公開面孔”,並愉快地將這些方法公開。 即使它們僅在程序集中使用-而不是程序集的公開外觀的一部分-沒關系,因為請注意,您的調解器類本身未聲明為公共。 因此,即使它的公共方法仍然在程序集內部。
2)您可以通過使用internal for private來偽造private(如果測試類位於單獨的程序集中,則設置程序集的InternalsVisibleTo屬性)。
3)采用“黑匣子”方法進行單元測試,原則上您不需要測試私有對象,因為從公共方法調用私有對象時,它們是通過使用它們進行測試的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.