Sobes.tech
Middle

stop və mock arasındakı fərq nədir?

sobes.tech Süni İntellekt

AI-dan cavab

stop — bu, testin birbaşa asılılıqlardan (məsələn, xarici API çağırışları, verilənlər bazaları kimi) ayrılması texnikasıdır və real obyektlərin test üçün nəzərdə tutulmuş saxtakarlıq obyektləri ilə əvəz olunmasıdır. Bu, xarici asılılıqların davranışını idarə etmək və testlərin təkrarlanabilirliyini təmin etmək üçün istifadə olunur.

mock ("mock object"-dən törəyən) — bu, test saxtakarlığının növüdür, yalnızca real obyekti əvəz etmir, həm də test olunan kodun onunla necə qarşılıqlı əlaqədə olduğunu yoxlamağa imkan verir. Mocks vasitəsilə metod çağırışları, onların arqumentləri və çağırış sayı haqqında (assert) iddia edə bilərsiniz.

Beləliklə, stop daha ümumi bir anlayışdır və izolasyonu təsvir edir, mock isə onu həyata keçirmək üçün konkret vasitədir və qarşılıqlı əlaqənin doğrulanmasına imkan verir.

PHPUnitMockery ilə nümunə:

<?php

use PHPUnit\Framework\TestCase;
use Mockery;

// Xarici asılılıqdan istifadə edən sinif
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') {
            // Aktiv istifadəçi üçün emal loqikası
            return true;
        }
        return false;
    }
}

// Mock istifadə nümunəsi
class UserProcessorTest extends TestCase
{
    public function testProcessUserDataWithActiveUser()
    {
        // ApiClient üçün mock yaradılır
        $apiClientMock = Mockery::mock(ApiClient::class);

        // Mock-un gözlənilən davranışını qururuq
        // fetchUserData metodunun 123 arqumenti ilə çağırılmasını gözləyirik
        $apiClientMock->shouldReceive('fetchUserData')
                      ->with(123)
                      ->andReturn(['status' => 'active', 'data' => '...']) // Mock bu məlumatları qaytarır
                      ->once(); // Metodun yalnız bir dəfə çağırılmasını gözləyirik

        // Test ediləcək obyekt yaradılır, mock ilə
        $userProcessor = new UserProcessor($apiClientMock);

        // Test edilən metodu çağırırıq
        $result = $userProcessor->processUserData(123);

        // Nəticəni yoxlayırıq
        $this->assertTrue($result);

        // Bütün gözləntilərin yerinə yetirildiyini yoxlayırıq
        Mockery::close();
    }
}

Bu nümunədə, ApiClient yerinə "mock" qoyulur. Biz real API çağırışını "süni" etdik və fetchUserData(123) çağırışında müəyyən məlumatların qaytarılmasını konfiqurasiya etdik. Həmçinin, bu metodun düzgün arqumentlərlə və bir dəfə çağırıldığını yoxlayırıq. Bu, əsas fərqdir: mock qarşılıqlı əlaqəni yoxlamağa imkan verir.