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.