簡體   English   中英

帶有中介模式的單元測試-私有對公共

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM