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.