Así que tengo el siguiente código en uso en todo mi sistema. Actualmente estamos escribiendo pruebas unitarias retrospectivamente (mejor tarde que nunca fue mi argumento), pero no veo cómo esto sería comprobable.
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
);
}
}
Conceptualmente, esto debería ser aplicable a cualquier lenguaje, pero estoy usando PHP. El código simplemente crea un objeto de consulta ElasticSearch, basado en un Searchobjeto, que a su vez está construido a partir de un EmailAlertobjeto. Estos Searchy EmailAlert's son solo POPO's.
Mi problema es que no veo cómo puedo burlarme del SearcherFactory(que usa el método estático), ni del SearchEntityToQueryAdapter, que necesita los resultados SearcherFactory::getSearchDirector y la Searchinstancia. ¿Cómo se inyecta algo que se genera a partir de resultados dentro de un método? ¿Tal vez hay algún patrón de diseño que no conozco?
¡Gracias por cualquier ayuda!
::es para métodos estáticos.
::llama a un método estático en la clase.
$this->context->addViolationllamada, dentro delif.