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 Searchobjeto, que por sua vez é criado a partir de um EmailAlertobjeto. Estes Searche EmailAlertsã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 Searchinstâ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->addViolationchamada, dentro daif.