使用Mediator模式进行单元测试 - 所有私有对公共

时间:2009-11-02 22:42:29

标签: c# unit-testing design-patterns mediator

我正在使用中介模式来促进GUI对象的单元测试。

psudo code示例:

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时会发生什么,而不必创建一个Window。

我担心的是,我采取了一种私人方法,并将其公开给任何让调解员打电话的人。过去我做过这件事并没有打扰我,因为我没有很多方法可以公开。

我目前正在重构一个非常大的类来使用这种模式,我想知道是否有某种程度上我可以控制谁可以制作MyMediator的可见性或者某些方法公开的类。 (这可能是不可能的,甚至不需要,但我想我会问。)

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

3 个答案:

答案 0 :(得分:3)

我认为没关系..除了gui之外,谁有调解员的实例?如果有人这样做,是否会调用该方法?如果是的话,重要吗?是否很难注意到,诊断并修复错误?

我认为你可以用事件来实现你想要的东西:

e.g。

/* 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)
{

}

答案 1 :(得分:3)

不确定c#,但在java中你可以将某些东西声明为包级访问(在java中省略访问说明符)。我所做的是创建一个独立的测试层次结构,与我的包结构相似,所以为了测试类com.a.b.c.MyClass,我将有一个测试类com.a.b.c.MyClassTest,然后可以合法地访问MyClass中的包访问方法。

我不太喜欢将所有内容公开,不仅因为访问问题,而且因为它使界面混乱 - 我宁愿该类的公共接口表达什么它确实如此,而不是如何它,如果我公开我更喜欢私有的方法,这通常是我最终的结果。

答案 2 :(得分:1)

关键是你想要一个类的公共接口来显示该类的公共'API',所以在私有方法公开时你会让这个类更加混乱而且不那么“干净”?

你可以做的一些事情: 1)仔细思考你的调解员(或卑微的对象)课程的“公众面孔”,并愉快地将这些方法公之于众。即使它们只是在集会中使用 - 而不是集会公众面孔的一部分 - 这是可以的,因为注意到你的调解员类本身并未被公开。所以即使它的公共方法仍然是集会的内部。

2)你可以通过使用internal for private来强制私有(如果你的测试类在一个单独的程序集中,则设置程序集的InternalsVisibleTo属性)。

3)采用“黑匣子”方法进行单元测试,原则上你永远不需要测试私有,因为它们是通过公共方法调用时通过它们的使用进行测试的。