Portanto, tenho o seguinte trecho de código em uso em todo o meu sistema. No momento, estamos escrevendo testes de unidade retrospectivamente (antes tarde do que nunca foi o meu argumento), mas não vejo como isso seria testável?
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
);
}
}
Conceitualmente, isso deve ser aplicável a qualquer idioma, mas estou usando PHP. O código simplesmente cria um objeto de consulta ElasticSearch, com base em um Search
objeto, que por sua vez é criado a partir de um EmailAlert
objeto. Estes Search
e EmailAlert
são apenas POPO.
Meu problema é que não vejo como zombar do SearcherFactory
(que usa o método estático), nem do SearchEntityToQueryAdapter
, que precisa dos resultados SearcherFactory::getSearchDirector
e da Search
instância. Como injeto algo que é construído a partir de resultados em um método? Talvez haja algum padrão de design que eu não conheça?
Obrigado por qualquer ajuda!
::
é para métodos estáticos.
::
chama um método estático na classe.
$this->context->addViolation
chamada, dentro daif
.