Mockery ile Taklit ve Sahte Nesne Kullanımı
Esnek test benzerleriyle birimleri yalıtın.
Mockery ile Taklit ve Sahte Nesne Kullanımı, CoddyKit'te ücretsiz bir PHP Academy dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, PHP Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. PHP Academy kursu toplamda 4 dersten oluşur.
Neden Özel Bir Sahte Nesne Kitaplığı
PHPUnit kendi sınama ikizi API'sini sunar; ancak Mockery, daha akıcı ve ifade gücü yüksek bir sözdizimi ile PHPUnit'in taklit nesnelerinde bulunmayan yetenekler sunar — kısmi taklit nesneleri, casuslar, esnek bağımsız değişken eşleştirme ve sıralı beklentiler. Karmaşık işbirliklerine dayanan kodlarda Mockery çoğu zaman çok daha okunaklıdır. Bu derste sahte nesnelerin tamamı ve her birinin ne zaman kullanılacağı ele alınmaktadır.
composer require --dev mockery/mockeryKukla mı, Taklit Nesne mi, Casus mu
Kesin bir söz varlığı, kafası karışık sınamaları önler:
- Kukla — önceden belirlenmiş değerler döndürür; durumu (sonucu) doğrularsınız.
- Taklit nesne — çağrılarla ilgili beklentilere sahiptir; davranışı (doğru şekilde çağrıldığını) doğrularsınız. Karşılanmayan beklentiler sınamayı başarısız kılar.
- Casus — çağrıları kaydeder ve sonradan doğrulamanıza olanak tanır.
Pratik kural: sorgular için kuklaları, komutlar için taklit nesneleri veya casusları tercih edin.
allows() Kullanan Bir Kukla
Çağrının gerçekleştiğini doğrulamadan önceden belirlenmiş dönüş değerleri sağlamak için Mockery::mock() ve allows() (veya shouldReceive()->andReturn()) kullanın. Burada bir geçit kuklası, hesaplamayı yalıtılmış olarak sınayabilmemiz için bilinen bir döviz kuru sağlar.
<?php
use Mockery;
use PHPUnit\Framework\TestCase;
final class ConverterTest extends TestCase
{
public function test_converts_using_rate(): void
{
$rates = Mockery::mock(RateGateway::class);
$rates->allows()->rateFor('USD', 'EUR')->andReturn(0.9);
$sut = new Converter($rates);
self::assertSame(90.0, $sut->convert(100.0, 'USD', 'EUR'));
Mockery::close();
}
}
expects() Kullanan Bir Taklit Nesne
Etkileşimin kendisi sözleşmeyse — örneğin, "bir e-posta tam olarak bir kez gönderilmelidir" — expects() veya shouldReceive()->once() kullanın. Mockery, beklentiyi Mockery::close() sırasında doğrular; karşılanmayan bir çağrı sınamayı başarısız kılar.
<?php
use Mockery;
$mailer = Mockery::mock(Mailer::class);
$mailer->expects()
->send(Mockery::type(Message::class))
->once();
$service = new SignupService($mailer);
$service->register('ada@example.com');
Mockery::close(); // fails here if send() was never called
Bağımsız Değişken Eşleştiricileri
Mockery'nin eşleştiricileri, beklentilerin gerektiği kadar gevşek veya katı olmasını sağlar:
Mockery::any()— herhangi bir değer.Mockery::type('string')/ bir sınıf adı — tür denetimi.Mockery::on(fn($a) => ...)— özel koşul.Mockery::capture($var)— daha sonra doğrulamak üzere bağımsız değişkeni yakalar.
<?php
use Mockery;
$repo = Mockery::mock(UserRepo::class);
$repo->expects()
->save(Mockery::on(fn(User $u) => $u->isActive()))
->once()
->andReturnTrue();
Dönüş Dizileri ve Dinamik Dönüşler
Çağrılar boyunca birden çok dönüş değerini betikleyebilir veya andReturnUsing() ile dönüşü bağımsız değişkenlerden hesaplayabilirsiniz. Bu, yeniden deneme mantığını, sayfalamayı veya durum bilgisi taşıyan işbirlikçileri modeller.
<?php
use Mockery;
$api = Mockery::mock(HttpClient::class);
// First call throws, second succeeds (retry test):
$api->shouldReceive('get')
->twice()
->andThrow(new \RuntimeException('timeout'))
->andReturn('{"ok":true}');
// Or derive the return from the input:
$api->shouldReceive('echo')
->andReturnUsing(fn(string $in) => strtoupper($in));
Casuslar: Sonradan Doğrulama
Casus sırayı tersine çevirir: önce işlemi gerçekleştirin, sonra doğrulayın. Mockery::spy() çağrıları kaydeder; ardından bunları shouldHaveReceived() ile sorgularsınız. Casuslar, önceden belirlenmiş beklentilerin kurulumu karmaşıklaştırmasını istemediğinizde Hazırla-Uygula-Doğrula yapısını temiz tutar.
<?php
use Mockery;
$logger = Mockery::spy(Logger::class);
$service = new PaymentService($logger);
$service->charge(500);
// Assertions happen AFTER the action:
$logger->shouldHaveReceived('info')
->with(Mockery::pattern('/charged 500/'))
->once();
Mockery::close();
Kısmi Taklit Nesneleri
Bazen gerçek bir nesne ister, ancak bir yöntemini geçersiz kılmak istersiniz — buna kısmi taklit nesnesi denir. Mockery'nin makePartial() işlevi, beklenti belirlediğiniz yöntemler dışındaki gerçek yöntemleri çağırarak çalışır. Bunu ölçülü kullanın: kısmi taklit nesnelerine aşırı bağımlılık genellikle bir sınıfın gereğinden fazla iş yaptığını gösterir.
<?php
use Mockery;
$report = Mockery::mock(Report::class)->makePartial();
// Only stub the slow/external method; the rest runs for real
$report->shouldReceive('fetchRawData')->andReturn(['a', 'b', 'c']);
// real summarize() runs, using the stubbed data
$summary = $report->summarize();
Sahibi Olmadığınız Şeyleri Taklit Etmeyin
Temel bir sınama ilkesi: üçüncü taraf sınıflarını doğrudan taklit etmekten kaçının. API'leri değişebilir ve taklidiniz gerçeklikten sessizce uzaklaşabilir. Bunun yerine onları kendi arayüzünüzün arkasında sarın ve bu arayüzü taklit edin. Böylece taklit nesnesi sizin sözleşmenizi doğrular, bir uyarlama tümleştirme sınaması da gerçek bağlantıyı doğrular.
<?php
interface PaymentGateway { // you own this
public function charge(int $cents, string $token): string;
}
final class StripeGateway implements PaymentGateway {
public function __construct(private \Stripe\StripeClient $client) {}
public function charge(int $cents, string $token): string {
return $this->client->paymentIntents->create([/* ... */])->id;
}
}
// Tests mock PaymentGateway, never \Stripe\StripeClient directly.
Her Zaman Kapatın ve Sayıları Doğrulayın
İki önemli işlem:
- Beklentilerin gerçekten doğrulanması ve genel değişkenlerin temizlenmesi için
tearDown()içindeMockery::close()çağrısı yapın (veyaMockeryPHPUnitIntegrationözelliğini kullanın). - Açık sayılar kullanın (
once(),times(n),never()) — belirsiz taklit nesneleri hataların gözden kaçmasına izin verir.
<?php
use PHPUnit\Framework\TestCase;
use Mockery\Adapter\Phpunit\MockeryPHPUnitIntegration;
final class OrderServiceTest extends TestCase
{
use MockeryPHPUnitIntegration; // auto-calls Mockery::close()
public function test_does_not_refund_paid_orders(): void
{
$gw = \Mockery::mock(PaymentGateway::class);
$gw->shouldReceive('refund')->never();
// ... exercise SUT ...
}
}
Sıralı Beklentiler
Bazen çağrı sırası sözleşmenin bir parçasıdır — commit() işleminden önce beginTransaction() çağrılmalıdır. Mockery'nin ordered() işlevi sırayı zorunlu kılar ve çağrılar yanlış sırada gelirse sınamayı başarısız kılar. Bunu yalnızca sıra gerçekten önemli olduğunda kullanın; sırayı gereğinden fazla belirtmek kırılgan sınamalara yol açar.
<?php
use Mockery;
$tx = Mockery::mock(Transaction::class);
$tx->shouldReceive('begin')->once()->ordered();
$tx->shouldReceive('commit')->once()->ordered();
$service = new TransferService($tx);
$service->run();
Mockery::close(); // fails if commit() happened before begin()
Hızlı Kontrol
Kukla mı, taklit nesne mi — hangisi ne için?
Özet
Mockery'nin sahte nesnelerinde ustalaştınız:
- Sorgular için kuklalar (
allows), komutlar için taklit nesneleri (expects), sonradan doğrulama için casuslar. - Bağımsız değişken eşleştiricileri (
type,on,capture) katılık düzeyini ayarlar. - Dönüş dizileri ve
andReturnUsing, durum bilgisi taşıyan veya dinamik işbirlikçileri modeller. - Kısmi taklit nesneleri tekil yöntemleri geçersiz kılar; bunları ölçülü kullanın.
- Sahibi olmadığınız şeyleri taklit etmeyin — üçüncü tarafları kendi arayüzünüzün arkasında sarın.
- Her zaman
Mockery::close()çağrısı yapın ve açık çağrı sayılarını doğrulayın.
Sırada: tümleştirme ve işlevsel sınamalar.
Sıkça Sorulan Sorular
“Mockery ile Taklit ve Sahte Nesne Kullanımı” dersi ücretsiz mi?
Evet — “Mockery ile Taklit ve Sahte Nesne Kullanımı” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve PHP Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. PHP Academy kursu toplamda 4 dersten oluşur.
“Mockery ile Taklit ve Sahte Nesne Kullanımı” dersinde ne öğreneceğim?
Esnek test benzerleriyle birimleri yalıtın. PHP Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
PHP Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te PHP Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.
“Mockery ile Taklit ve Sahte Nesne Kullanımı” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu PHP Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her PHP Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Test Odaklı Geliştirme İş Akışı
- Mockery ile Taklit ve Sahte Nesne Kullanımı
- Entegrasyon ve İşlevsel Test
- Infection ile Mutasyon Testi