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.