C# 将演示者添加到现有的旧WinForm以添加UnitTests?

C# 将演示者添加到现有的旧WinForm以添加UnitTests?,c#,winforms,unit-testing,legacy-code,C#,Winforms,Unit Testing,Legacy Code,在我的工作中,我们有一个使用winforms编写的大型遗留代码库 遗留代码没有任何形式的关注点分离,高度敏感和脆弱的业务逻辑与按钮单击事件、网格行事件等交织在一起 我想开始在单元测试中引入一些这种逻辑,以便更好地理解这种逻辑,并且(希望)允许将来以更大的信心和速度完成从winforms的迁移(这是白日梦吗?) 为了开始添加单元测试,我知道Michael Feather的伟大著作《使用遗留代码》以及在代码中引入允许测试的接缝的概念。据我所知,这是通过引入服务来实现的,这些服务可以注入表单中,以在u

在我的工作中,我们有一个使用winforms编写的大型遗留代码库

遗留代码没有任何形式的关注点分离,高度敏感和脆弱的业务逻辑与按钮单击事件、网格行事件等交织在一起

我想开始在单元测试中引入一些这种逻辑,以便更好地理解这种逻辑,并且(希望)允许将来以更大的信心和速度完成从winforms的迁移(这是白日梦吗?)

为了开始添加单元测试,我知道Michael Feather的伟大著作《使用遗留代码》以及在代码中引入允许测试的接缝的概念。据我所知,这是通过引入服务来实现的,这些服务可以注入表单中,以在ui层之外执行业务逻辑。对于业务逻辑来说,这似乎是一种很好的方法,但对于测试更普通的ui元素(例如基于某些用户操作设置用户控件的可见状态)来说,它似乎不太管用

对于上面的示例,我想知道为遗留winform引入Presenter类、将用户交互传递给新创建的Presenter、让Presenter执行正确的逻辑并通过视图界面设置视图状态是否有意义。这将允许我使用模拟视图接口对演示者的方法编写测试

下面是这样的

public class LegacyPresenter
{
  ILegacyView view;
  
  public void SetViewState(string value)
  {
    switch (value)
    {
      case "case 1":
        view.Button1Visible = true;
      case "case 2"
        view.Button1Visible = false;
    }
  }
}

public class LegacyView
{
  public LegacyPresenter Presenter;
  ...
  private void SomeEvent_Clicked()
  {
    this.Presenter.SetViewState("case 2");
  }
}
目前,在我们的代码中,WinForm中存在的上述“SetViewState”方法存在缺陷。为这个旧表单引入Presenter类,将“SetViewState”从视图移动到新的Presenter,然后针对Presenter编写单元测试,这样做有意义吗


表单目前有4k行代码,所以我现在只对演示者重构这一个方法。这有意义吗?或者我只是在遗留代码上浪费时间?

什么缺陷?什么是演示者?你使用一些建筑模式吗?哪一个?什么是您无法准确进行单元测试的?这是否回答了您的问题?以上问题的答案是我在这里讨论的实现方法(我们在编写的任何新表单中都使用MVP模型)。我的问题是,在现有表单上实现MVP模式的部分实现是否有意义。