Итак, у меня есть следующий фрагмент кода, который используется во всей моей системе. В настоящее время мы пишем модульные тесты ретроспективно (лучше поздно, чем никогда не было моим аргументом), но я не понимаю, как это будет тестироваться?
public function validate($value, Constraint $constraint)
{
$searchEntity = EmailAlertToSearchAdapter::adapt($value);
$queryBuilder = SearcherFactory::getSearchDirector($searchEntity->getKeywords());
$adapter = new SearchEntityToQueryAdapter($queryBuilder, $searchEntity);
$query = $adapter->setupBuilder()->build();
$totalCount = $this->advertType->count($query);
if ($totalCount >= self::MAXIMUM_MATCHING_ADS) {
$this->context->addViolation(
$constraint->message
);
}
}
Концептуально это должно быть применимо к любому языку, но я использую PHP. Код просто создает объект запроса ElasticSearch на основе Search
объекта, который, в свою очередь, создается из EmailAlert
объекта. Это Search
и EmailAlert
есть просто ПОПО.
Моя проблема заключается в том , что я не понимаю , как я могу издеваться вне SearcherFactory
(который использует статический метод), ни SearchEntityToQueryAdapter
, что нужны результаты SearcherFactory::getSearchDirector
и на Search
экземпляр. Как мне внедрить что-то, что создается из результатов в методе? Может быть, есть какой-то шаблон дизайна, о котором я не знаю?
Спасибо за любую помощь!
источник
$this->context->addViolation
вызова, внутриif
.::
это для статических методов.::
вызывает статический метод для класса.Ответы:
Есть некоторые возможности, как смоделировать
static
методы в PHP, лучшее решение, которое я использовал, - это библиотека AspectMock , которую можно получить через composer (как смоделировать статические методы вполне понятно из документации).Тем не менее, это в последнюю минуту решение проблемы, которая должна быть решена другим способом.
Если вы все еще хотите выполнить модульное тестирование слоя, отвечающего за преобразование запросов, есть довольно быстрый способ сделать это.
Я предполагаю, что сейчас
validate
метод является частью некоторого класса, и очень быстрое решение, которое не требует преобразования всех ваших статических вызовов в вызов экземпляра, - это создание классов, действующих в качестве прокси для ваших статических методов, и внедрение этих прокси в классы. который ранее использовал статические методы.источник
Во-первых, я бы предложил разделить это на отдельные методы:
Это оставляет вас в ситуации, когда вы можете рассмотреть возможность сделать эти два новых метода общедоступными, а также модульное тестирование
QueryTotal
иShowMessageWhenTotalExceedsMaximum
индивидуально. Жизнеспособный вариант здесь на самом деле не для модульного тестированияQueryTotal
вообще, так как вы бы по существу тестировали только ElasticSearch. Написание модульного теста дляShowMessageWhenTotalExceedsMaximum
должно быть легким и имеет гораздо больший смысл, так как это фактически проверит вашу бизнес-логику.Однако, если вы предпочитаете тестировать «validate» напрямую, рассмотрите возможность передачи самой функции запроса в качестве параметра в «validate» (со значением по умолчанию
$this->QueryTotal
), это позволит вам смоделировать функцию запроса. Я не уверен, правильно ли я понял синтаксис PHP, поэтому в случае, если я этого не сделал, прочитайте это как «Псевдокод»:источник