Sobes.tech
Middle

V čom spočíva rozdiel medzi stop a mock?

sobes.tech AI

Odpoveď od AI

stop — je technika izolácie testu od priamej závislosti (napríklad volaní na tretie API, databázy) nahradením skutočných objektov testovacími záložkami. Používa sa na kontrolu správania vonkajších závislostí a zabezpečenie reprodukovateľnosti testov.

mock (odvozené od "mock object") — je druh testovacej záložky, ktorá nielen nahrádza skutočný objekt, ale aj umožňuje overovať, ako s ním interaguje testovaný kód. Pomocou mockov je možné tvrdiť (assert) o volaniach metód, ich argumentoch a počte volaní.

Teda, stop je všeobecnejší pojem opisujúci izoláciu, zatiaľ čo mock je konkrétny nástroj na jej dosiahnutie, pridávajúci možnosť verifikácie interakcie.

Príklad s použitím PHPUnit a Mockery:

<?php

use PHPUnit\Framework\TestCase;
use Mockery;

// Trieda využívajúca vonkajšiu závislosť
class UserProcessor
{
    private $apiClient;

    public function __construct(ApiClient $apiClient)
    {
        $this->apiClient = $apiClient;
    }

    public function processUserData(int $userId): bool
    {
        $data = $this->apiClient->fetchUserData($userId);

        if ($data && $data['status'] === 'active') {
            // Logika spracovania aktívneho používateľa
            return true;
        }
        return false;
    }
}

// Príklad použitia mocku na testovanie
class UserProcessorTest extends TestCase
{
    public function testProcessUserDataWithActiveUser()
    {
        // Vytvorenie mocku pre ApiClient
        $apiClientMock = Mockery::mock(ApiClient::class);

        // Nastavenie očakávaného správania pre mock
        // Očakáva sa volanie metódy fetchUserData s argumentom 123
        $apiClientMock->shouldReceive('fetchUserData')
                      ->with(123)
                      ->andReturn(['status' => 'active', 'data' => '...']) // Mock vracia tieto dáta
                      ->once(); // Očakávame, že metóda bude volaná presne raz

        // Vytvorenie testovaného objektu s odovzdaným mockom
        $userProcessor = new UserProcessor($apiClientMock);

        // Spustenie testovanej metódy
        $result = $userProcessor->processUserData(123);

        // Kontrola výsledku
        $this->assertTrue($result);

        // Kontrola, že všetky očakávania mocku boli splnené
        Mockery::close();
    }
}

V tomto príklade je ApiClient nahradený "mockom". Zastavili sme skutočné volanie API a zároveň nastavili mock na vrátenie určitých dát pri volaní fetchUserData(123). Tiež overujeme, že tento metóda bola volaná s správnymi argumentmi a raz. To je kľúčový rozdiel: mock umožňuje overovať interakcie.