Mam więc następujący kod w całym systemie. Obecnie piszemy testy jednostkowe retrospektywnie (lepiej późno niż nigdy nie był mój argument), ale nie rozumiem, jak to byłoby możliwe do przetestowania?
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
);
}
}
Koncepcyjnie powinno to dotyczyć dowolnego języka, ale używam PHP. Kod po prostu tworzy obiekt zapytania ElasticSearch oparty na Search
obiekcie, który z kolei jest zbudowany z EmailAlert
obiektu. To Search
i EmailAlert
są tylko POPO.
Moim problemem jest to, że nie widzę, w jaki sposób można wyśmiewać się z SearcherFactory
(który wykorzystuje metodę statyczną), ani SearchEntityToQueryAdapter
, który potrzebuje wyników SearcherFactory::getSearchDirector
i ten Search
przypadek. Jak wstrzyknąć coś, co powstaje na podstawie wyników w ramach metody? Może jest jakiś wzór, o którym nie wiem?
Dzięki za wszelką pomoc!
źródło
$this->context->addViolation
połączenia, wewnątrzif
.::
jest to metoda statyczna.::
wywołuje metodę statyczną w klasie.Odpowiedzi:
Istnieje kilka posibilitów, jak wyśmiewać
static
metody w PHP, najlepszym rozwiązaniem, którego użyłem, jest biblioteka AspectMock , którą można przeciągnąć przez kompozytora (jak wyśmiewać metody statyczne jest całkiem zrozumiałe z dokumentacji).Jest to jednak rozwiązanie w ostatniej chwili problemu, który powinien zostać rozwiązany w inny sposób.
Jeśli nadal chcesz testować jednostkowo warstwę odpowiedzialną za przekształcanie zapytań, istnieje dość szybki sposób, jak to zrobić.
Zakładam, że teraz
validate
metoda jest częścią jakiejś klasy, bardzo szybką poprawką, która nie wymaga transformacji wszystkich wywołań statycznych na wywołanie instancji, jest budowanie klas działających jako proxy dla metod statycznych i wstrzykiwanie tych proxy do klas które poprzednio stosowały metody statyczne.źródło
Po pierwsze, proponuję podzielić to na osobne metody:
To pozostawia cię w sytuacji, w której możesz rozważyć upublicznienie tych dwóch nowych metod oraz test jednostkowy
QueryTotal
iShowMessageWhenTotalExceedsMaximum
indywidualnie. Opłacalną opcją jest tutaj wcale nie testowanie jednostkoweQueryTotal
, ponieważ zasadniczo testowałbyś tylko ElasticSearch. Napisanie testu jednostkowegoShowMessageWhenTotalExceedsMaximum
powinno być łatwe i bardziej sensowne, ponieważ faktycznie przetestowałoby logikę biznesową.Jeśli jednak wolisz przetestować „sprawdzanie poprawności” bezpośrednio, rozważ przekazanie samej funkcji zapytania jako parametru do „sprawdzania poprawności” (z wartością domyślną
$this->QueryTotal
), pozwoli to na wyszydzenie funkcji zapytania. Nie jestem pewien, czy mam poprawną składnię PHP, więc jeśli nie, przeczytaj to jako „Pseudo kod”:źródło