Sobes.tech
Middle+

Na czym polega różnica między stop a mock?

sobes.tech AI

Odpowiedź od AI

stop jest używany w celach debugowania do przerwania wykonywania skryptu i sprawdzenia stanu w określonym momencie. mock to technika w testach jednostkowych służąca do symulacji zachowania zewnętrznych zależności klasy lub funkcji, w celu izolacji testowanego kodu.

Stop:

  • Cel: Debugowanie, sprawdzanie wyników pośrednich.
  • Zastosowanie: Podczas rozwoju, do tymczasowego zatrzymania wykonania.
  • Narzędzia: Funkcje wbudowane (die(), exit()), narzędzia debugowania (xdebug).
<?php
// Przykład użycia stop do debugowania
$data = ['item1', 'item2'];
echo "Przed przetwarzaniem danych.\n";
// Zatrzymujemy wykonanie, aby sprawdzić zawartość $data
die(var_dump($data));
echo "Po przetwarzaniu danych.\n"; // Ten kod nie zostanie wykonany

Mock:

  • Cel: Testy jednostkowe, izolacja testowanego kodu.
  • Zastosowanie: Tworzenie "wtyczek" dla zależności (bazy danych, API zewnętrzne, inne klasy).
  • Narzędzia: Frameworki testowe (PHPUnit) i biblioteki do tworzenia mocków (Mockery).
<?php
// Przykład koncepcji mocka (bez użycia frameworka, dla ilustracji)
// Symulacja zależności
interface DataFetcher {
    public function fetchData(): array;
}

// Klasa1, zależna od DataFetcher (testowana)
class DataProcessor {
    private DataFetcher $fetcher;

    public function __construct(DataFetcher $fetcher) {
        $this->fetcher = $fetcher;
    }

    public function processData(): array {
        $data = $this->fetcher->fetchData();
        // Logika przetwarzania
        foreach ($data as &$item) {
            $item = strtoupper($item);
        }
        return $data;
    }
}

// Obiekt mock dla DataFetcher w teście
class MockDataFetcher implements DataFetcher {
    public function fetchData(): array {
        // Zwraca dane zdefiniowane zamiast rzeczywistego zapytania
        return ['mock_item_1', 'mock_item_2'];
    }
}

// W teście:
$mockFetcher = new MockDataFetcher();
$processor = new DataProcessor($mockFetcher);
$processed = $processor->processData();
// Sprawdza, czy $processed zawiera ['MOCK_ITEM_1', 'MOCK_ITEM_2']

Użycie mocków pozwala testować logikę klasy A bez polegania na poprawnym działaniu lub dostępności klasy B, od której A zależy. Zamiast rzeczywistej klasy B, używa się mocka, który zwraca przewidywalne dane lub sprawdza, czy wywołano określone metody.