Элегантный способ обращаться с конструктором только для тестирования - PullRequest
0 голосов
/ 27 октября 2018

У меня есть базовый класс, который используется во многих местах:

class base {

  base(param1, param2 ...) // constructor 1, which is the legit constructor

  base(param3, param4 ...) // constructor only for unit testing!!!
  base(param5, param6 ...) // constructor only for unit testing!!!
}

Есть ли элегантный способ справиться с этим делом? Это действительно сбивает с толку иметь некоторые конструкторы только для тестирования. Я упрощаю приведенный выше случай, и в действительности у нас есть несколько «реальных» конструкторов и еще много «поддельных» конструкторов. Со временем люди начали использовать фальшивый конструктор, и он стал не обслуживаемым ... Какой более элегантный способ добиться этого?

Ответы [ 2 ]

0 голосов
/ 12 марта 2019

В качестве первого шага, чтобы избежать использования дополнительных конструкторов, которые будут использоваться непреднамеренно: вы можете создать конструкторы, предназначенные для использования только при тестировании private, и сделать класс тестирования friend.Это, безусловно, может также использоваться для альтернатив необычному подходу «конструкторы для тестирования»: например, предоставление частных сеттеров для разрешения изменения состояния объекта для тестирования.

Если причина наличия дополнительных конструкторовЭто упрощает настройку теста: может быть более элегантно создавать вспомогательные фабричные функции в вашем тесте.Это создаст правильно настроенные экземпляры base.Например, у вас могут быть заводские функции, такие как make_base_that_behaves_like_xxx или make_base_for_xxx.Затем фабричные функции в идеале должны вызывать «законный» конструктор и выполнять дополнительные адаптации к объекту по мере необходимости.Это может даже привести к более удобочитаемому решению, чем подход с несколькими специализированными конструкторами.

Обратите внимание, что введение специальных конструкторов иногда может быть полезно для решения проблем тестирования с унаследованным кодом, но не настолько, какшаблон проектирования для вновь созданного кода: Перья описывают его под именем Parameterize Constructor .

0 голосов
/ 28 октября 2018

Что делают фальшивые конструкторы, чего нельзя сделать в вашем тестовом коде?

Тестирование через общедоступный API, как правило, желательно, поскольку оно определяет набор поведений, которые вы хотите гарантировать, чтобы они были реализованы правильно.

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

Смотри также: https://testing.googleblog.com/2013/03/testing-on-toilet-testing-state-vs.html

...