Mi a különbség a stop és a mock között?
sobes.tech MI
Válasz az MI-től
stop — ez egy tesztelési technika, amely elválasztja a tesztet a közvetlen függőségektől (például külső API-k hívásai, adatbázisok) úgy, hogy a valódi objektumokat tesztelési hamis objektumokra cseréli. Ezt arra használják, hogy kontrollálják a külső függőségek viselkedését és biztosítsák a tesztek reprodukálhatóságát.
mock (a "mock object" származéka) — egy teszt hamis objektum, amely nemcsak a valódi objektumot helyettesíti, hanem lehetővé teszi, hogy ellenőrizzük, hogyan lép kölcsönhatásba a tesztelt kód vele. A mock-ok segítségével állíthatunk (assert) a metódushívásokról, azok argumentumairól és a hívások számáról.
Tehát, a stop egy általános fogalom, amely az izolációt írja le, míg a mock egy konkrét eszköz ennek elérésére, amely lehetővé teszi az interakciók ellenőrzését.
Példa PHPUnit és Mockery használatával:
<?php
use PHPUnit\Framework\TestCase;
use Mockery;
// Osztály, amely külső függőséget használ
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') {
// Aktív felhasználó feldolgozási logika
return true;
}
return false;
}
}
// Mock példány használata teszteléshez
class UserProcessorTest extends TestCase
{
public function testProcessUserDataWithActiveUser()
{
// Mock létrehozása az ApiClient-hez
$apiClientMock = Mockery::mock(ApiClient::class);
// Várt viselkedés beállítása a mock-ra
// Várjuk, hogy a fetchUserData metódus hívásra kerül 123 argumentummal
$apiClientMock->shouldReceive('fetchUserData')
->with(123)
->andReturn(['status' => 'active', 'data' => '...']) // A mock ezeket az adatokat adja vissza
->once(); // Várjuk, hogy a metódus pontosan egyszer hívódik
// A tesztelendő objektum létrehozása, a mock átadásával
$userProcessor = new UserProcessor($apiClientMock);
// A tesztelt metódus futtatása
$result = $userProcessor->processUserData(123);
// Eredmény ellenőrzése
$this->assertTrue($result);
// A mock összes elvárt viselkedésének ellenőrzése
Mockery::close();
}
}
Ebben a példában az ApiClient helyett egy "mock" van. Hamisítottuk a valódi API hívást, és beállítottuk a mock-ot, hogy bizonyos adatokkal térjen vissza a fetchUserData(123) hívásakor. Emellett ellenőrizzük, hogy ez a metódus a megfelelő argumentumokkal és egyszer lett meghívva. Ez a fő különbség: a mock lehetővé teszi az interakciók ellenőrzését.