如何在MVP中对Presenter进行正确的单元测试

时间:2017-11-30 09:14:28

标签: unit-testing mvp presenter

我正在使用MVP模式。并且面临着通过单元测试覆盖演示者的问题。

行为: 视图(表单)上有两个按钮 - 确定和应用。

如果按下确定按钮,则必须验证数据,并且在成功的情况下必须保存数据并且必须关闭视图。

如果按下“应用”按钮,则必须验证数据,如果成功,则必须保存数据,然后必须重新加载数据并且必须刷新视图。

Presenter有两种方法,在按下Ok和Apply按钮的情况下由View调用。它们分别是OkButtonPressed和ApllyButtonPressed。

这是Presenter的伪代码

private
  // view intreface
  View : IView; 
  function TrySaveChanges: boolean {
    //Validate data by calling Model's methods
    //Save data by calling Model's methods
    // In case of any error call View to show an error message
  }      
  function RefreshData: boolean {
    //Load data by calling Model's methods
  };
  function RefershView: boolean {
    //Call View's methods to refresh the data on it
  };

public
  procedure OkButtonPressed {
    if TrySaveChanges {
      View.Close;
    }
  }
  procedure ApplyButtonPressed {
    If TrySaveChanges {
      RefreshData;
      RefershView;
    }  
  }

如何通过单元测试覆盖此类代码? Roy Osherove说测试公共方法是公共方法称为私人方法。因此,通过公开测试,可以测试私有行为。 但是在上面的例子中,很少有Presenter的公共方法调用相同的私有方法。 应该为OkButtonPressed和ApplyButtonPressed方法测试什么? 关于TrySaveChanges的Roy行为必须在OkButtonPressed和ApplyButtonPressed方法的测试中进行测试。但这会产生测试和重复吗?#34;? 如果我不测试OkButtonPressed和ApplyButtonPressed方法的测试中的TrySaveChanges方法行为,那么我应该在哪里测试它? 也许问题在于Presenter本身?

1 个答案:

答案 0 :(得分:0)

我认为你有几个选择:

  1. 将TrySaveChanges提取到自己的类中/将该逻辑移动到模型中。

  2. 接受将公共代码提取到私有方法中有时会导致在测试中多次执行这些方法。

  3. 对我来说,两者都很完美。