Jak przetestowac metode z parametrem przekazywanym przez referencje?

0

Witam,

Musze napisac unit testy dla takiej metody:

<?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;
        }

        // (...)
    }
}
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.
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.

0

getStatus() to magiczna metoda.

0

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

1

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

$product = $this->getMock(Product::class, ['stock', 'allocation', 'getStatus']);

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