Sobes.tech
Middle

V čem spočívá rozdíl mezi stop a mock?

sobes.tech AI

Odpověď od AI

stop — je technika izolace testu od přímých závislostí (například volání třetích API, databází) nahrazením skutečných objektů testovacími záložkami. Používá se k řízení chování vnějších závislostí a zajištění reprodukovatelnosti testů.

mock (odvozeno od "mock object") — je druh testovací záložky, která nejen nahrazuje skutečný objekt, ale také umožňuje ověřovat, jak s ním interaguje testovaný kód. Pomocí mocků lze tvrdit (assert) o voláních metod, jejich argumentech a počtu volání.

Tedy, stop je obecnější pojem popisující izolaci, zatímco mock je konkrétní nástroj k jejímu dosažení, který přidává možnost ověření interakce.

Příklad s použitím PHPUnit a Mockery:

<?php

use PHPUnit\Framework\TestCase;
use Mockery;

// Třída využívající vnější závislost
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 zpracování aktivního uživatele
            return true;
        }
        return false;
    }
}

// Příklad použití mocku pro testování
class UserProcessorTest extends TestCase
{
    public function testProcessUserDataWithActiveUser()
    {
        // Vytvoření mocku pro ApiClient
        $apiClientMock = Mockery::mock(ApiClient::class);

        // Nastavení očekávaného chování pro mock
        // Očekává se volání metody fetchUserData s argumentem 123
        $apiClientMock->shouldReceive('fetchUserData')
                      ->with(123)
                      ->andReturn(['status' => 'active', 'data' => '...']) // Mock vrací tato data
                      ->once(); // Očekáváme, že metoda bude volána přesně jednou

        // Vytvoření testovaného objektu s předaným mockem
        $userProcessor = new UserProcessor($apiClientMock);

        // Spuštění testované metody
        $result = $userProcessor->processUserData(123);

        // Ověření výsledku
        $this->assertTrue($result);

        // Ověření, že všechna očekávání mocku byla splněna
        Mockery::close();
    }
}

V tomto příkladu je ApiClient nahrazen "mockem". Zastavili jsme skutečný volání API a zároveň nakonfigurovali mock tak, aby vracel určitá data při volání fetchUserData(123). Také ověřujeme, že tento metod byl volán s správnými argumenty a přesně jednou. To je klíčový rozdíl: mock umožňuje ověřovat interakce.