Wat is het verschil tussen stop en mock?
sobes.tech AI
Antwoord van AI
stop — is een techniek om een test te isoleren van directe afhankelijkheden (bijvoorbeeld, calls naar externe API's, databases) door echte objecten te vervangen door testdummies. Het wordt gebruikt om het gedrag van externe afhankelijkheden te controleren en reproduceerbaarheid van tests te waarborgen.
mock (afgeleid van "mock object") — is een soort testdummy die niet alleen het echte object vervangt, maar ook toelaat te controleren hoe de geteste code ermee interageert. Met mocks kan men (assert) uitspraken doen over method calls, hun argumenten en het aantal keren dat ze worden aangeroepen.
Dus, stop is een meer algemeen begrip dat isolatie beschrijft, en mock is een concreet hulpmiddel om dat te bereiken, met de mogelijkheid interacties te verifiëren.
Voorbeeld met PHPUnit en Mockery:
<?php
use PHPUnit\Framework\TestCase;
use Mockery;
// Klasse die een externe afhankelijkheid gebruikt
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 voor verwerking van actieve gebruiker
return true;
}
return false;
}
}
// Voorbeeld van mock gebruik voor testen
class UserProcessorTest extends TestCase
{
public function testProcessUserDataWithActiveUser()
{
// Maak mock voor ApiClient
$apiClientMock = Mockery::mock(ApiClient::class);
// Stel verwacht gedrag in voor de mock
// Verwacht dat fetchUserData wordt aangeroepen met argument 123
$apiClientMock->shouldReceive('fetchUserData')
->with(123)
->andReturn(['status' => 'active', 'data' => '...']) // Mock geeft deze data terug
->once(); // Verwacht dat de methode precies één keer wordt aangeroepen
// Maak het te testen object, met de mock
$userProcessor = new UserProcessor($apiClientMock);
// Voer de geteste methode uit
$result = $userProcessor->processUserData(123);
// Controleer het resultaat
$this->assertTrue($result);
// Controleer dat alle verwachtingen van de mock zijn voldaan
Mockery::close();
}
}
In dit voorbeeld wordt ApiClient vervangen door een "mock". We hebben de echte API-aanroep "faked" en de mock geconfigureerd om bij het aanroepen van fetchUserData(123) bepaalde data terug te geven. We verifiëren ook dat deze methode met de juiste argumenten en één keer is aangeroepen. Dit is het kernverschil: mock maakt het mogelijk om de interactie te verifiëren.