0

我正在使用 MVP 模式。并且面临着用单元测试覆盖 Presenter 的问题。

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

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

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

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 说要测试公共方法,因为公共方法称为私有方法。因此,通过对 public 的测试,可以测试 private 的行为。但是在上面的例子中,很少有 Presenter 的公共方法调用相同的私有方法。OkButtonPressed 和 ApplyButtonPressed 方法应该测试什么?关于 TrySaveChanges 的 Roy 行为,必须在 OkButtonPressed 和 ApplyButtonPressed 方法的测试中进行测试。但这会产生测试“重复”吗?如果我没有在 OkButtonPressed 和 ApplyButtonPressed 方法的测试中测试 TrySaveChanges 方法的行为,那么我应该在哪里测试呢?也许问题出在 Presenter 本身?

4

1 回答 1

0

我认为您在这里有几个选择:

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

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

对我来说,两者都很好。

于 2017-12-04T19:24:14.097 回答