Sobes.tech
Middle

У чему се састоји разлика између stop и mock?

sobes.tech АИ

Одговор од АИ

stop — техника је изолације теста од директних зависности (на пример, позивања на стране API-је, базе података) замењивањем реалних објеката тест-заглушкама. Она се користи за контролу понашања спољашњих зависности и обезбеђивање репродуктивности тестова.

mock (од "mock object") — врста тест-заглушке која не само да замењује реалан објекат, већ и омогућава проверу како тестирани код интерагује са њим. Помоћу mock-ова може се тврдити (assert) о позивима метода, њиховим аргументима и броју позива.

Дакле, stop је општији појам који описује изолацију, а mock је конкретан алат за њено постизање, који додаје могућност верификације интеракције.

Пример са коришћењем PHPUnit и Mockery:

<?php

use PHPUnit\Framework\TestCase;
use Mockery;

// Класа која користи спољашњу зависност
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') {
            // Логика обраде активног корисника
            return true;
        }
        return false;
    }
}

// Пример коришћења mock за тестирање
class UserProcessorTest extends TestCase
{
    public function testProcessUserDataWithActiveUser()
    {
        // Креирање mock-а за ApiClient
        $apiClientMock = Mockery::mock(ApiClient::class);

        // Подешавање очекиваног понашања за mock
        // Очекује се позив метода fetchUserData са аргументом 123
        $apiClientMock->shouldReceive('fetchUserData')
                      ->with(123)
                      ->andReturn(['status' => 'active', 'data' => '...']) // Mock враћа ове податке
                      ->once(); // Очекује се да ће метод бити позван тачно једном

        // Креирање тестиране објекта са предатим mock-ом
        $userProcessor = new UserProcessor($apiClientMock);

        // Извршавање тестиране методе
        $result = $userProcessor->processUserData(123);

        // Провера резултата
        $this->assertTrue($result);

        // Провера да су сва очекивања mock-а испуњена
        Mockery::close();
    }
}

У овом примеру ApiClient се замењује са "mock". Ми смо "заглушили" стварни позив API-ја и истовремено подесили mock да враћа одређене податке при позиву fetchUserData(123). Такође, верификујемо да је овај метод позван са исправним аргументима и једном. Ово је кључна разлика: mock омогућава проверу интеракција.