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

wmtdaxz3  于 2022-12-14  发布在  其他
关注(0)|答案(1)|浏览(122)

在使用MVP模式时,我有时需要调用演示者的公共方法中的私有方法,并更改视图的一些属性。在这些情况下,我如何有效地对视图的更改和私有方法的行为进行单元测试?

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;
}
kninwzqo

kninwzqo1#

根据您所展示的内容,一些选项包括:
1.模拟设置这些值的两个方法,
1.将_settingsconfig甚至是提供结果的两个方法拆分到一个单独的类中(类似于配置类),并将该类的接口作为依赖项注入到任何有意义的级别。
我会选择其中一个。
关于视图值,我会尝试将其分离。此代码存在一些问题。
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 }
}

你可以更进一步,用不同的方式处理私有方法。你可能想添加一个单独的类来替换它们,这样主题也更容易测试/模拟。

相关问题