J'ai donc le morceau de code suivant utilisé partout dans mon système. Nous écrivons actuellement des tests unitaires rétrospectivement (mieux vaut tard que jamais mon argument), mais je ne vois pas comment cela serait 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
);
}
}
Conceptuellement, cela devrait être applicable à n'importe quel langage, mais j'utilise PHP. Le code construit simplement un objet de requête ElasticSearch, basé sur un Search
objet, qui à son tour est construit à partir d'un EmailAlert
objet. Ces Search
et EmailAlert
« s ne sont que POPO de.
Mon problème est que je ne vois pas comment je peux simuler le SearcherFactory
(qui utilise la méthode statique), ni le SearchEntityToQueryAdapter
, qui a besoin des résultats SearcherFactory::getSearchDirector
et de l' Search
instance. Comment injecter quelque chose qui se construit à partir des résultats dans une méthode? Peut-être y a-t-il un modèle de conception que je ne connais pas?
Merci pour toute aide!
::
c'est pour les méthodes statiques.
::
appelle une méthode statique sur la classe.
$this->context->addViolation
appel, à l'intérieur duif
.