Sobes.tech
Middle

stop ve mock arasındaki fark nedir?

sobes.tech yapay zeka

AI'dan gelen yanıt

stop — bu, testin doğrudan bağımlılıklardan (örneğin, harici API çağrıları, veritabanları gibi) izole edilmesi için gerçek nesnelerin test kısımlarına yerleştirilen taklit nesnelerle değiştirilmesi tekniğidir. Bu, dış bağımlılıkların davranışını kontrol etmek ve testlerin tekrar üretilebilirliğini sağlamak için kullanılır.

mock ("mock object" türevi) — sadece gerçek nesneyi değiştirmekle kalmayıp, aynı zamanda test edilen kodun onunla nasıl etkileşime geçtiğini doğrulamaya imkan tanıyan bir test taklididir. Mocks kullanılarak, metod çağrıları, argümanlar ve çağrı sayısı hakkında (assert) ifadeler kurulabilir.

Dolayısıyla, stop daha genel bir kavram olup izolasyonu tanımlar, mock ise bunu başarmak için kullanılan, etkileşimin doğrulanmasına olanak sağlayan somut bir araçtır.

PHPUnit ve Mockery kullanılarak örnek:

<?php

use PHPUnit\Framework\TestCase;
use Mockery;

// Dış bağımlılık kullanan sınıf
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') {
            // Aktif kullanıcı işleme mantığı
            return true;
        }
        return false;
    }
}

// Mock kullanımı örneği
class UserProcessorTest extends TestCase
{
    public function testProcessUserDataWithActiveUser()
    {
        // ApiClient için mock oluştur
        $apiClientMock = Mockery::mock(ApiClient::class);

        // Mock’un beklenen davranışını ayarla
        // fetchUserData metodunun 123 argümanıyla çağrılmasını bekle
        $apiClientMock->shouldReceive('fetchUserData')
                      ->with(123)
                      ->andReturn(['status' => 'active', 'data' => '...']) // Mock bu veriyi döner
                      ->once(); // Metodun tam olarak bir kez çağrılmasını bekle

        // Mock’u alan test edilen nesne oluştur
        $userProcessor = new UserProcessor($apiClientMock);

        // Test edilen metodu çalıştır
        $result = $userProcessor->processUserData(123);

        // Sonucu doğrula
        $this->assertTrue($result);

        // Tüm beklentilerin karşılandığını kontrol et
        Mockery::close();
    }
}

Bu örnekte, ApiClient yerine bir "mock" kullanılır. Gerçek API çağrısı "sahte" hale getirilmiş ve fetchUserData(123) çağrısında belirli verilerin döndürülmesi sağlanmıştır. Ayrıca, bu metodun doğru argümanlarla ve bir kez çağrıldığını doğrularız. Bu, temel farktır: mock, etkileşimin doğrulanmasını sağlar.