如何对MVP模式中具有私有方法的公共方法进行单元测试

时间:2019-09-20 07:55:25

标签: c# winforms unit-testing mvp xunit

在WinForms中使用MVP模式时,我遇到了一些场景,在这些场景中,我在Presenter的公共方法中调用了一些私有方法,并更改了View的一些属性。

如何有效地对这些情况进行单元测试?

public void OnFileNameChanged(string fileName)
{
    _settings = FirstPrivateOperation()

    if (_settings == null)
    {
        _view.A = false;
        return;
    }

    var config = SecondPrivateOperation();

    if (config == null)
    {
        _view.B = true;
        return;
    }

    _view.C = true;
}

1 个答案:

答案 0 :(得分:1)

根据您显示的内容,一些选项是:

  1. 模拟设置这些值的两种方法
  2. 中断_settingsconfig或什至将结果提供到一个单独的类中的两个方法(如配置类的东西),并将该类的接口作为依赖项注入到任何级别说得通。然后,您可以模拟这些值。

我会选择其中一种选择。

关于View值,我会尝试将其分开。这段代码有很多问题。

  1. 您有一个OnFileNameChanged方法,您可能无法更改其签名并且不返回任何内容。因此,我将进一步分离代码。删除其中的代码,然后创建另一个您可以控制的方法。不要在该设置中添加任何“视图”设置。目的是要覆盖逻辑并返回带有一些计算值的对象。 然后,在OnFileNameChanged中分配所需的视图内容。简而言之,将逻辑部分移出并在其他地方处理并进行测试。

您有3个值要分配给View对象,因此使您的新方法返回一个值或一个包含三个值的对象,涵盖每种可能性。

public void OnFileNameChanged(string fileName)
{
   var calculatedValues = CalculateValues(//might need some params here)

   _view.A = calculatedValues.A;
   _view.B = calculatedValues.B;
   _view.C = calculatedValues.C;
}

public MyReturnType CalculateValues()
{
     var result = new MyReturnType();
     var config = FirstPrivateOperation();
     if ( config == null ) { return result; }

     //etc etc
}

public MyReturnType
{  
      public Whatever A { get;set }
      public Whatever B { get;set }
      public Whatever C { get;set }
}

您甚至可以走得更远,以不同的方式处理私有方法。您可能想添加一个单独的类来替换它们,然后使主题也更易于测试/模拟。