Модульное тестирование с использованием шаблона посредника: все от частного к публичному

StackOverflow https://stackoverflow.com/questions/1664201

Вопрос

Я использую шаблон посредника для облегчения модульного тестирования объектов графического интерфейса.

Пример псевдокода:

Class MyGuiClass
{
  //...  Declare and initialize mediator to be a MyMediator
  private void On_SomeButtonPressed()
  {
     mediator.SomeButtonWasPressed();
  }
}

Class MyMeditator
{
  public void On_SomeButtonPressed()
  {
     //.. Do something now that the button was pressed
  }

}

Это хорошо, потому что теперь я могу выполнить модульное тестирование того, что происходит при нажатии SomeButton, без необходимости создавать окно.

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

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

(Я использую С# 3.0 с .NET 3.5 SP1)

Это было полезно?

Решение

Дело в том, что вы хотите, чтобы общедоступный интерфейс класса показывал общедоступный «API» этого класса, поэтому, делая общедоступными частные методы, вы делаете класс более запутанным и менее «чистым»?

Несколько вещей, которые вы можете сделать:1) продумайте, что на самом деле является «публичным лицом» вашего класса-посредника (или скромного объекта) и с радостью сделайте эти методы общедоступными.Даже если они используются только внутри сборки, а не являются частью общедоступного облика сборки, это нормально, поскольку обратите внимание, что сам ваш класс-посредник не объявлен общедоступным.Таким образом, даже его публичные методы по-прежнему остаются внутренними для сборки.

2) Вы можете подделать частные, используя внутренний для частного (а затем установите атрибут InternalsVisibleTo сборки, если ваши тестовые классы находятся в отдельной сборке).

3) Используйте подход «черного ящика» к модульному тестированию, при котором в принципе вам никогда не нужно тестировать приватные методы, поскольку они проверяются посредством их использования при вызове из общедоступных методов.

Другие советы

думаю это не имеет значения..У кого есть экземпляр посредника, кроме графического интерфейса?Если кто-то это сделает, будет ли он вызывать метод?Если да, имеет ли это значение?Будет ли сложно заметить, диагностировать и исправить ошибку?

Я думаю, что вы можете достичь того, чего ищете, с помощью событий:

например

/* in the gui class (view) */
public event EventHandler OnButtonClicked;

/* in the mediator */
public MyMediator(MyView view) 
{
    view.OnButtonClicked += HandleButtonClicked;
}

private void HandleButtonClicked(object sender, EventArgs e)
{

}

Не уверен насчет С#, но в Java вы можете объявить что-то как доступ на уровне пакета (в Java, опуская спецификатор доступа).Что я делаю, так это создаю отдельную иерархию тестов, которая параллельна структуре моего пакета, поэтому для тестирования класса com.a.b.c.MyClass у меня будет тестовый класс com.a.b.c.MyClassTest, который затем сможет легально обращаться к методам доступа к пакету в MyClass.

Мне не очень нравится идея сделать все общедоступным не только из-за проблем с доступом, но и потому, что это загромождает интерфейс — я бы предпочел открытый интерфейс класса express что Это не как он это делает, и часто именно так я и оказываюсь, если раскрываю методы, которые предпочитаю быть конфиденциальными.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top