Как выполнить юнит-тестирование публичного метода, который имеет приватные методы в шаблоне MVP - PullRequest
0 голосов
/ 20 сентября 2019

При использовании шаблона MVP для WinForms я сталкиваюсь со сценариями, в которых я вызываю некоторые частные методы в своем публичном методе Presenter и изменяю несколько свойств представления.

Как я могу выполнить модульное тестирование в таких ситуациях эффективно ?

public void OnFileNameChanged(string fileName)
{
    _settings = FirstPrivateOperation()

    if (_settings == null)
    {
        _view.A = false;
        return;
    }

    var config = SecondPrivateOperation();

    if (config == null)
    {
        _view.B = true;
        return;
    }

    _view.C = true;
}

1 Ответ

1 голос
/ 20 сентября 2019

Некоторые параметры, основанные на том, что вы показали, будут:

  1. макетировать два метода, которые устанавливают эти значения,
  2. break _settings и config или дажедва метода, которые предоставляют результаты в отдельный класс (например, что-то вроде конфигурации) и внедряют интерфейс этого класса как зависимость на любом уровне, который имеет смысл.Затем вы можете издеваться над этими ценностями.

Я бы выбрал один из этих вариантов.

Что касается значений View, я бы попытался отделить это.У этого кода есть ряд проблем.

  1. у вас есть метод OnFileNameChanged, и вы, вероятно, не можете изменить его подпись и ничего не возвращать.Итак, я бы выделил код еще больше.Выньте код из него и создайте другой метод, которым вы управляете.Не добавляйте никаких настроек просмотра в этом.Цель заключается в том, чтобы покрыть логику и вернуть объект с некоторыми вычисленными значениями.Затем в OnFileNameChanged вы назначаете то, что вам нужно для просмотра.Короче говоря, возьмите логическую часть, разберитесь с ней где-нибудь еще и проверьте это.

У вас есть 3 значения, которые вы присваиваете объекту View, поэтому ваш новый метод должен возвращать либо одно значение,или объект с тремя значениями, охватывающий каждую возможность.

public void OnFileNameChanged(string fileName)
{
   var calculatedValues = CalculateValues(//might need some params here)

   _view.A = calculatedValues.A;
   _view.B = calculatedValues.B;
   _view.C = calculatedValues.C;
}

public MyReturnType CalculateValues()
{
     var result = new MyReturnType();
     var config = FirstPrivateOperation();
     if ( config == null ) { return result; }

     //etc etc
}

public MyReturnType
{  
      public Whatever A { get;set }
      public Whatever B { get;set }
      public Whatever C { get;set }
}

Вы можете пойти еще дальше и по-другому разобраться с закрытыми методами.Вы можете захотеть добавить отдельный класс для их замены, и тогда это также облегчит тестирование / макет темы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...