1

我正在使用中介者模式来促进 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 时发生的情况进行单元测试,而无需创建窗口。

我担心的是,我采用了一种私有的方法,并将其公开给任何让 Mediator 调用的人。过去我这样做并没有打扰我,因为我没有太多必须公开的方法。

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

(我将 C# 3.0 与 .NET 3.5 SP1 一起使用)

4

3 回答 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)
{

}
于 2009-11-02T23:02:04.873 回答
3

不确定 c#,但在 java 中,您可以将某些内容声明为包级访问(在 java 中通过省略访问说明符)。我所做的是创建一个与我的包结构平行的单独测试层次结构,因此为了测试类 com.abcMyClass,我将有一个测试类 com.abcMyClassTest,然后它可以合法地访问 MyClass 中的包访问方法。

我不太喜欢将所有内容公开的想法,不仅因为访问问题,而且因为它使接口变得混乱 - 我宁愿类的公共接口表达它的作用,而不是它如何做到的,这如果我公开我更喜欢私有的方法,通常是我最终的结果。

于 2009-11-02T23:17:16.330 回答
1

关键是您希望一个类的公共接口显示该类的公共“API”,所以在公开私有方法时,您会使该类更加混乱和不那么“干净”?

您可以做的几件事:1)考虑一下您的中介(或不起眼的对象)类的“公众面孔”实际上是什么,并愉快地公开这些方法。即使它们仅在程序集内使用 - 不是程序集公开面的一部分 - 也没关系,因为请注意您的调解器类本身未声明为公共的。因此,即使它的公共方法仍然在程序集内部。

2)您可以通过使用 internal 来伪造私有(如果您的测试类位于单独的程序集中,则设置程序集的 InternalsVisibleTo 属性)。

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

于 2011-01-13T13:09:26.413 回答