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 Searchobjet, qui à son tour est construit à partir d'un EmailAlertobjet. Ces Searchet 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' Searchinstance. 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->addViolationappel, à l'intérieur duif.