Jak przetestowac metode z parametrem przekazywanym przez referencje?

Jak przetestowac metode z parametrem przekazywanym przez referencje?
poniatowski
  • Rejestracja:ponad 16 lat
  • Ostatnio:około 15 godzin
  • Postów:1663
0

Witam,

Musze napisac unit testy dla takiej metody:

Kopiuj
<?php


class Items
{
    public function setTicketStatusAndPersist(Product &$product): void
    {
        if($product->stock() >= $product->allocation() && $product->getStatus() === 'onSale') {
            $product->setStatus('soldOut');
            $product->setPersistSoldOut(true);
            
            return;
        }

        if($product->stock() < $product->allocation() && $product->getStatus() === 'soldOUt') {
            $product->setStatus('soldOUt');
            $product->setPersistSoldOut(true);

            return;
        }

        // (...)
    }
}
edytowany 2x, ostatnio: poniatowski
serek
  • Rejestracja:około 11 lat
  • Ostatnio:około 6 godzin
  • Postów:1476
0
  1. Spokojnie te dwa pierwsze if możesz połączyć w jedną część za pomocą ||, bo teraz niepotrzebna duplikacja kodu. I ten warunek powinieneś wydzielić do osobnej metody.
  2. Nie podałeś całej metody, więc ciężko się wypowiedzieć dokładnie. Ale na podstawie tego co masz, to po prostu tworzysz w teście obiekt, przekazujesz go do testowanej metody, a potem po robisz assert sprawdzający, czy status i ten drugi atrybut są zmienione i mają określone wartości.
  3. Ta metoda wydaje się strasznie przekombinowana.
edytowany 1x, ostatnio: serek
poniatowski
  • Rejestracja:ponad 16 lat
  • Ostatnio:około 15 godzin
  • Postów:1663
0

To jest tylko szkielet. Nie zastanawiajmy sie nad logika przykladu mojej metody. Chodzi mi wylacznie o przetesotwanie referencji. Zrobilem jak piszesz ale problem jest taki, ze musialem napisac mock z klasy $product, a kazda parameter klasy jest protected w mock klasie. Wiec nie moge dostac sie do nowego statusu produktu.

poniatowski
  • Rejestracja:ponad 16 lat
  • Ostatnio:około 15 godzin
  • Postów:1663
0

getStatus() to magiczna metoda.

serek
  • Rejestracja:około 11 lat
  • Ostatnio:około 6 godzin
  • Postów:1476
1
poniatowski
  • Rejestracja:ponad 16 lat
  • Ostatnio:około 15 godzin
  • Postów:1663
0

Chyba właśnie nie mam za duzego wybory. Myslałem, poza ReflectionClass usunąć referencje i po prostu zwracać return $product.

Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:około 10 godzin
  • Postów:10094
1

Jak używasz phpUnit to możesz zrobić mocki dla magicznych metod:

Kopiuj
$product = $this->getMock(Product::class, ['stock', 'allocation', 'getStatus']);
edytowany 1x, ostatnio: Riddle

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.