我正在使用 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 本身?