Как правильно провести модульный тест для Presenter в MVP

Я использую шаблон 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?


person dream2work    schedule 30.11.2017    source источник


Ответы (1)


Думаю, у вас есть несколько вариантов:

  1. извлечь TrySaveChanges в собственный класс / переместить эту логику в модель.

  2. согласитесь с тем, что извлечение общего кода в частные методы иногда приводит к выполнению этих методов более одного раза в ваших тестах.

Для меня и то, и другое было бы прекрасно.

person bairprogramming    schedule 04.12.2017