So I have the following piece of code in use all over my system. We're currently writing unit tests retrospectively (better late than never was my argument), but I don't see how this would be testable?
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
);
}
}
Conceptually this should be applicable to any language, but I'm using PHP. The code simply builds up an ElasticSearch query object, based on a Search
object, which in turn is built off an EmailAlert
object. These Search
and EmailAlert
's are just POPO's.
My problem is that I don't see how I can mock out the SearcherFactory
(which uses the static method), nor the SearchEntityToQueryAdapter
, which needs the results from SearcherFactory::getSearchDirector
and the Search
instance. How do I inject something that gets built from results within a method? Maybe there's some design pattern I'm not aware of?
Thanks for any help!
$this->context->addViolation
call, inside theif
.::
is for static methods.::
calls a static method on the class.