PHP Unit testing - testowanie proteted/private metod?

0

Witam,

Mam sobie kilka protected method. Kilka metod jest dosc krotka, a 2-3 metody maja dosc sporo if...else oraz petli. Moje pytanie jakie jest najlepsze podejscie do przetestowania proteted/private method?

1

Przez przetestowanie metod publicznych które z nich korzystają.

0

Niby tak, ale to bedzie masa zabawy. Myslalem, ze jest inna latwiejsza metoda. I bede musial kopiowac kilkanascie razy ten sam kod praktycznie :/ Cool.

0

Jeżeli będziesz musiał kopiować kod to znaczy, że robisz coś źle.

0
poniatowski napisał(a):

a 2-3 metody maja dosc sporo if...else oraz petli.

To znaczy, że są źle napisane.

0

@serek: Jak poprawnie napisac taka metode?

    protected function setState($ticket, $currentTicket)
    {
        if (property_exists($ticket, 'single')) {
            $ticket->single->state = $currentTicket->getStatus();
        }

        if (property_exists($ticket, 'group')) {
            $ticket->group->state = $currentTicket->getStatus();
        }

        return $ticket;
    }

0
poniatowski napisał(a):

@serek: Jak poprawnie napisac taka metode?

To nie jest "sporo" xD Zresztą zgaduję że tam pewnie zamiast 2x if wystarczy if else, więc w sumie masz 1 if.

I używanie property_exists to chyba zły pomysł. Nie lepiej jakieś dziedziczenie, a potem użyć chociażby instanceof?

1

Co do if...else to nie powinno się stosować tej konstrukcji - nawet wiele analizatorów kodu zwraca używanie else jako "warning", bo mocno utrudnia to czytanie dłuższego kodu. To co zastosował OP jest lepsze od if else, ale też niezbyt fajne.

Co do property_exists to jest to blebleble.

Samo warunkowe istnienie property to jest moim zdaniem antywzorzec OOP, tak samo jak wszelkie "temporary fields", a już na pewno dostęp do mutowalnego property z zewnątrz obiektu to baaardzo złe rozwiązanie. Patrząc po tym krótkim fragmencie kodu to powinieneś mieć TicketInterface/AbstractTicket implementowany przez 2 klasy typu TicketSingle/TicketGroup z metodą setState(); Sama metoda z Twojego posta powinna wyglądać mniej więcej tak:

protected function setState(TicketInterface $ticket, TicketInterface $currentTicket): TicketInterface
{
    $ticket->setState($currentTicket->getState());
    return $ticket; //tutaj też raczej nie powinno być tego returna, ale to kwestia sporna więc zostawiam.
}

Ogólnie patrząc po tym fragmencie kodu TO NA 100% jest coś źle.

Co do testowania metod protected/private to raczej się tego nie robi, bo testy jednostkowe mają testować publiczne api klasy, a nie wewnętrzną logikę, więc tak jak ktoś wyżej napisał testujemy poprzez odpowiednie dobranie przypadków testowych i użycie publicznego interfejsu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1