Sobes.tech
Middle

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.