Ana içeriğe atla

Laravel Model İlişki Unit Test

Laravel Elequent modelleri laravelin en güçlü taraflarından birisi. Modelleri birbirleri ile ilişkilendirerek çok rahat veri yapılarını oluşturabiliyorsunuz.

Laravele eklenen ilişkiler için unit test yazmanız gerekse bunu şöyle yapabilirsiniz.

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Account extends Model
{
use HasFactory;

public function investor()
{
return $this->belongsTo(Investor::class);
}
}

Bu örnek modelimiz olsun. İnvestor ilişkisine birim testi yazmak isteyelim.

<?php

namespace Tests\Unit\Models;

use App\Models\Account;
use App\Models\Investor;
use Mockery;
use PHPUnit\Framework\TestCase;

class AccountTest extends TestCase
{

public function test_belongs_to_investor()
{
$account = Mockery::mock(Account::class)->makePartial();
$account->shouldReceive('belongsTo')
->once()
->with(Investor::class)
->andReturn('result from parent');

$result = $account->investor();

$this->assertEquals('result from parent', $result);
}
}

Unit testlerde en önemli özellik test edeceğiniz birimi mümkün olan herşeyden yalıtmak. Bunu da yapmanın kolay yolu mock'ları kullanmak.

Mock bir objenin test edilmeye uygun kopyasının oluşturulmasıdır.

İlişkiyi test etmek istediğinizde en büyük zorluk Elequent'in db'ye bağlanmak istemesidir. Bir diğer zorluk da belongsTo methodunun modelimizin extends olduğu Model objesinden gelmesidir. 

DB'ye bağlanmadan bir işlev yapabilmesi için belongsTo methodu için mock oluşturmak gerekmektedir.

Fakat Test edeceğiniz class'ın tamamını mock oluşturursanız test edeceğiniz methodda mocklanacaktır. Bizim örneğimizde investor methodu. Bunun için Mock oluştururken makePartial() methodunu belirtmeniz gerekir. makePartial methodu test edeceğiniz classtan obje oluştururken var olan methodlarına dokunmaz sizin test için eklediğiniz methodları oluşturu. Bizim test için eklediğimiz method ise belongsTo methodu. Mock oluştururken methodumuzun ne parametre alacağını ve geriye ne döneceğinide belirleriz.

Methodu çalıştırdıktan sonra geriye dönen değer ile oluşturduğumuz değeri karşılaştırdığımızda investor methodunun içindeki kodları test etmiş oluruz.

Bu test bize ne sağlar. Yeni özellikler eklerken bu methodda yapılacak değişiklikler var olan kodların çalışmasını bozacağını farkederiz. Bozulan yerleri tesbit edip, test kodunu yeni durum için yazıp diğer bozulan alanlarında testi olacağını var sayarsak onlarıda tek tek düzeltmemiz gerekir.

Yorumlar

Bu blogdaki popüler yayınlar

Etkinlik: PHP ve Mikroservisler

Etkinlik: PHP ve Mikroservisler Dün (15 Şubat 2020) İstanbul PHP User Group’un düzenlediği “PHP ve Mikroservisler” isminde bir etkinliğe katıldım. 3 oturum yapıldı. İlk oturumda ICS Defence’da takım lideri olan Erhan Yakut “PHP ve NATS ile Mikroservis Mesajlaşma” isminde bir sunum yaptı. Mikroservis mimarisi yeni yazılım geliştirme trendlerinden. Özetle, bir uygulamanın her bir modülünün tek başına çalışan bir uygulama olması. Tek başına çalışan servislerin apiler aracılığıyla birbirleri ile konuşarak verileri bir araya getirip istemciye sunulması. Avantajlarından şöyle bahsedebilirim. Her bir servis tek başına çalıştığı için herhangi bir dilde yazılabilir. Büyük bir projede kalabalık ekipler servisleri paylaşarak geliştirip ve bakımlarını yapabilir. Mikroservis mimarisinde servislerin birbirleri arasında haberleşmesinde birden fazla yöntem kullanılabilir. Http ile apiler kendi endpointlerine erişebilir. Eğer bu yöntem kullanılırsa her servisin bir web sunucuya ihtiyacı ol

Opencart 2.3+ Sipariş Geçmişi API hatası.

Eğer opencart'ta siparişleri düzenlerken "Uyarı : API erişim iznine sahip değilsiniz!" şeklinde bir uyarı alıyorsanız internette pek elle tutulur bilgi bulamayabilirsiniz. Bu hatanın asıl sebebi opencart'ın siparişe geçmiş ekleme işini site üzerinde bile API arayüzünü kullanmaya kalkması. Anlamayan arkadaşlar için kulağını ters elinle tutmak gibi bir şey. Halbuki kodların içerisinde eski usul düzenlenebileceği kodlar duruyor. Kendilerine iş aradıkları için olsa gerek. Geçiçi çözüm istiyorsanız sürekli "Ayarlar > Kullanıcılar > API" den Default hesabına ikinci sekmede "Ip Adresleri" içeriğine değişen IP adresini sürekli girmek gerekiyor. En kolay çözüm. https://www.opencart.com/index.php?route=marketplace/extension/info&extension_id=28323 yukarıdaki linkte bulunan extension'u siteye kurduğunuzda siz ip adresiniz değiştikçe kendisi otomatik eklenecek. Nasıl kurulacağını bilmiyorsanız. Araştırmaya devam. ...

MYSQL Performansı Etkileyen SQL Sorguları

Bir web sayfanız var ve yük altında çalışıyor ve yavaş çalışıyor. Performansı etkileyen bir çok nokta olabilir ama öncelikle database'e bakmak faydalı olabilir. Peki ama nasıl bakacağız. MYSQL'in kendi özelliği olan yavaş sorguları loglamayı kullanabiliriz. Bunu nasıl yapacağız. Öncelikle hangi sorgular bizim için yavaş bunu neye göre belirleyeceğiz. Süre bazından belirleniyor MYSQL de saniye cinsinden belirliyor. Öntanımlı olarak 10 saniye olarak belirlenen ayarı var ama bir sorgunun 10 saniyede sonuç üretmesi facia biz 1 saniyeden uzun süren sorguları araştırarak başlayabiliriz. Bu süreyi ayarlamak için; SET long_query_time = 1.0; Şeklinde bir sorgu çalıştırarak değiştirebiliriz. Ön tanımlı değeri 10.0 dur. Bu değer saniye cinsinden zaman birimidir. Logların yazmaya başlaması içinde; SET GLOBAL slow_query_log = ON; Şeklinde bir sorgu çalıştırmamız gerekiyor. Ön tanımlı değeri OFF dur. Bu Log dosyasıda  slow_query_log_file değişkeninden ayarlanabiliyor a