Care este diferența dintre stop și mock?
sobes.tech AI
Răspuns de la AI
stop — este o tehnică de izolare a testului față de dependențele directe (de exemplu, apeluri către API-uri externe, baze de date) prin înlocuirea obiectelor reale cu simulări de test. Este folosit pentru controlul comportamentului dependențelor externe și asigurarea reproductibilității testelor.
mock (derivat din "obiect mock") — este o varietate de simulare de test care nu doar înlocuiește obiectul real, ci permite și verificarea modului în care codul testat interacționează cu acesta. Cu mock-uri, se pot afirma (assert) despre apelurile de metode, argumentele lor și numărul de apeluri.
Prin urmare, stop este un concept mai general, care descrie izolarea, iar mock este un instrument concret pentru atingerea acesteia, adăugând posibilitatea de verificare a interacțiunii.
Exemplu cu PHPUnit și Mockery:
<?php
use PHPUnit\Framework\TestCase;
use Mockery;
// Clasă care utilizează o dependență externă
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') {
// Logica de procesare a utilizatorului activ
return true;
}
return false;
}
}
// Exemplu de utilizare a mock-ului pentru teste
class UserProcessorTest extends TestCase
{
public function testProcessUserDataWithActiveUser()
{
// Creăm un mock pentru ApiClient
$apiClientMock = Mockery::mock(ApiClient::class);
// Setăm comportamentul așteptat pentru mock
// Așteptăm apelul metodei fetchUserData cu argumentul 123
$apiClientMock->shouldReceive('fetchUserData')
->with(123)
->andReturn(['status' => 'active', 'data' => '...']) // Mock returnează aceste date
->once(); // Așteptăm ca metoda să fie apelată o singură dată
// Creăm obiectul de test, trecând mock-ul
$userProcessor = new UserProcessor($apiClientMock);
// Executăm metoda testată
$result = $userProcessor->processUserData(123);
// Verificăm rezultatul
$this->assertTrue($result);
// Verificăm că toate așteptările mock-ului au fost îndeplinite
Mockery::close();
}
}
În acest exemplu, ApiClient este înlocuit cu un "mock". Am "falsificat" apelul real către API și am configurat mock-ul să returneze anumite date la apelul fetchUserData(123). De asemenea, verificăm că această metodă a fost apelată cu argumentele corecte și o singură dată. Aceasta este diferența cheie: mock-ul permite verificarea interacțiunii.