Sobes.tech
Middle

Mis vahe on stop ja mock vahel

sobes.tech AI

Vastus AI-lt

stop — see on tehnika, mis eraldab testi otsetoimetestidest (näiteks, väliste API-de kutsed, andmebaasid) asendades reaalsed objektid testimoodulitega. Seda kasutatakse väliste sõltuvuste käitumise kontrollimiseks ja testide korduvuse tagamiseks.

mock ("mock object") — see on testimooduli tüüp, mis mitte ainult ei asenda reaalse objekti, vaid võimaldab ka kontrollida, kuidas testitav kood sellega suhtleb. Moki abil saab väita (assert) meetodite kutsumisi, nende argumente ja kutsumiste arvu.

Seega, stop on üldisem mõiste, mis kirjeldab isolatsiooni, ja mock on konkreetne tööriist selle saavutamiseks, mis lisab võimaluse kontrollida suhtlust.

Näide kasutades PHPUnit ja Mockery:

<?php

use PHPUnit\Framework\TestCase;
use Mockery;

// Klass, mis kasutab välist sõltuvust
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') {
            // Aktiivse kasutaja töötlemise loogika
            return true;
        }
        return false;
    }
}

// Näide mocki kasutamisest testimiseks
class UserProcessorTest extends TestCase
{
    public function testProcessUserDataWithActiveUser()
    {
        // Loo mock `ApiClient` jaoks
        $apiClientMock = Mockery::mock(ApiClient::class);

        // Seadista ootuspärane käitumine mockil
        // Ootame `fetchUserData` meetodi kutsumist argumendiga 123
        $apiClientMock->shouldReceive('fetchUserData')
                      ->with(123)
                      ->andReturn(['status' => 'active', 'data' => '...']) // mock tagastab need andmed
                      ->once(); // Ootame, et meetod kutsutakse täpselt üks kord

        // Loo testitav objekt koos mock-iga
        $userProcessor = new UserProcessor($apiClientMock);

        // Käivita testitav meetod
        $result = $userProcessor->processUserData(123);

        // Kontrolli tulemust
        $this->assertTrue($result);

        // Kontrolli, et kõik ootused on täidetud
        Mockery::close();
    }
}

Selles näites asendatakse ApiClient "moki"-ga. Me "peatame" reaalse API-kutse ja seadistame moki tagastama teatud andmeid, kui kutsutakse fetchUserData(123). Samuti kontrollime, et see meetod kutsuti õigete argumentidega ja ainult üks kord. See on peamine erinevus: mock võimaldab kontrollida suhtlust.