Я использую шаблон MVP. И столкнулся с проблемой прикрытия Presenter модульным тестированием.
Поведение: Вид (Форма) имеет две кнопки - ОК и Применить.
Если кнопка Ok нажата, данные должны быть проверены, и в случае успеха данные должны быть сохранены, а просмотр должен быть закрыт.
Если нажата кнопка «Применить», данные должны быть проверены, и в случае успеха данные должны быть сохранены, затем данные должны быть перезагружены, а представление должно быть обновлено.
В Presenter есть два метода, которые вызываются View при нажатии кнопок Ok и Apply. Это OkButtonPressed и ApllyButtonPressed соответственно.
Это псевдокод ведущего.
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;
}
}
Как покрыть такой код модульным тестом? Рой Ошеров советует тестировать общедоступные методы так же, как общедоступные методы вызывают частные. Таким образом, с помощью тестов для публичных можно проверить поведение приватных. Но в приведенном выше примере несколько общедоступных методов Presenter вызывают один и тот же частный метод. Что именно нужно тестировать для методов OkButtonPressed и ApplyButtonPressed? Что касается Роя, поведение TrySaveChanges необходимо протестировать в тестах для методов OkButtonPressed и ApplyButtonPressed. Но будут ли это давать «дубликаты» тестов? Если я не тестирую поведение методов TrySaveChanges в тестах для методов OkButtonPressed и ApplyButtonPressed, то где мне это тестировать? Может проблема в самом Presenter?