Sobes.tech
Middle

Kāda ir atšķirība starp stop un mock?

sobes.tech AI

Atbilde no AI

stop — tā ir tehnika, kas izolē testu no tiešajām atkarībām (piemēram, ārēju API izsaukumiem, datu bāzēm), aizstājot reālos objektus ar testēšanas aizstājējiem. To izmanto, lai kontrolētu ārējo atkarību uzvedību un nodrošinātu testu atkārtojamību.

mock (no "mock object") — tas ir testēšanas aizstājējs, kas ne tikai aizstāj reālo objektu, bet arī ļauj pārbaudīt, kā ar to sadarbojas testējamais kods. Ar mock palīdzību var apgalvot (assert) par metožu izsaukumiem, to argumentiem un izsaukumu skaitu.

Tādējādi, stop ir vispārīgāks jēdziens, kas raksturo izolāciju, bet mock ir konkrēts rīks tās sasniegšanai, kas pievieno iespēju pārbaudīt sadarbību.

Piemērs ar PHPUnit un Mockery:

<?php

use PHPUnit\Framework\TestCase;
use Mockery;

// Klase, kas izmanto ārēju atkarību
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īva lietotāja apstrādes loģika
            return true;
        }
        return false;
    }
}

// Piemērs ar mock testēšanai
class UserProcessorTest extends TestCase
{
    public function testProcessUserDataWithActiveUser()
    {
        // Izveido mock `ApiClient`
        $apiClientMock = Mockery::mock(ApiClient::class);

        // Uzstāda sagaidāmo uzvedību mock
        // Sagaida `fetchUserData` izsaukumu ar argumentu 123
        $apiClientMock->shouldReceive('fetchUserData')
                      ->with(123)
                      ->andReturn(['status' => 'active', 'data' => '...']) // Mock atgriež šos datus
                      ->once(); // Sagaida, ka metode tiks izsaukta tieši vienu reizi

        // Izveido testējamā objekta ar mock
        $userProcessor = new UserProcessor($apiClientMock);

        // Izpilda testējamā metodi
        $result = $userProcessor->processUserData(123);

        // Pārbauda rezultātu
        $this->assertTrue($result);

        // Pārbauda, vai visi mock sagaidījumi ir izpildīti
        Mockery::close();
    }
}

Šajā piemērā ApiClient tiek aizvietots ar "moku". Mēs "apturējām" reālo API izsaukumu un vienlaikus konfigurējām mock, lai atgrieztu noteiktus datus, izsaucot fetchUserData(123). Tāpat mēs pārbaudām, vai šī metode tika izsaukta ar pareiziem argumentiem un tikai vienu reizi. Tas ir galvenais atšķirības punkts: mock ļauj pārbaudīt sadarbību.