Ara:

Şu an misafir modundasın. YazılımDevi olmak ister misin? Giriş Yap / Kayıt Ol

Makale Hakkında!

Moq Framework ile Mükemmel TDD Deneyimleri Makale Yazarı Okunma Sayısı Eklenme Tarihi
Engin Demiroğ 593 18.01.2012

Makale Detayı

Moq Framework ile Mükemmel TDD Deneyimleri
 
Projelerimiz üzerinde Test Driven Development yaparken bazen, henüz başkalarının geliştirmesi gereken bir metoda  ihtiyaç duyabilirsiniz. Fakat metod henüz bitirilmemiştir. Ya da ihtiyacınız olan metod bir servis olarak yayındadır ama siz test ortamında kullanamıyorsunuz.
 
Herhangi bir Mock Framework ile ihtiyacınız olan bu metodu sahte bir şekilde oluşturup testinizi hayata geçirebilirsiniz.
Şimdi örnek bir senaryo ile işe başlayalım. YazılımDevi.Com Portalini yazmak istiyoruz.
 
Aşağıda bir gereksinim ve o gereksinime ait bir kabul kriteri görüyoruz. Eğer Scrum makalelerimi okuduysanız, kabul kriterlerinin aslında Test Case’ler için kaynak teşkil ettiğini hatırlayacaksınız.
 
Gereksinim(User Story):YazilimDevi.Com kullanıcısı olarak, en popüler makaleler listesini görmeliyim.
 
Kabul Kriterleri 1(Acceptance Criteria): Makale listesi üç elemandan oluşmalıdır.
 
Ve diğer kabul kriterleri...
 
Önce test yazdığımız zaman, elimizde ne iş katmanının ilgili metodu(EnPopulerMakaleleriListele), ne de bir üst seviyede bulunan Veri Katmanının metodu(EnPopulerMakaleleriListele) bulunacaktır. Biz de testimizin içinde olmayan iş katmanı metodunu çağırarak testi başlatırız. Fakat ne yazık ki veri katmanı henüz devrede olmadığı için elimizde veri olmayacak. Bu testi ilerletmekte güçlük çekeceğiz.
 
Bu durumu çözmek için benim aklıma ilk gelen, herhangi bir sıkıntı olmadığıdır. “Zaten TDD yapıyorum. İhtiyaç oldukça gidip Veri Katmanını da bir güzel oluşturacağım.” Peki Veri Katmanını siz yazmıyorsanız? Ya da analizler yapıldı ama ortada veri tabanı bile yoksa? Ya da bu katman bir servis ise ve test ortamında bu servislere ulaşmak mümkün değilse? Dolayısıyla ya ihtiyacınız olan işlerin bitmesini bekleyeceksiniz, ya da Moq Framework benzeri bir araçla sahte yapılar oluşturacaksınız(Mocking).
 
Bu sahte yapıları oluşturmak için, ihtiyacımız olan sınıfın yapısını ve operasyonlarını(metodlarını vs.) temsil edecek bir interface oluştururuz.
 
Şimdi bir örnek üzerinde olayı anlayalım. Olabildiğince gerçek hayat uygulaması üzerinden konuşacağız.
 
1.Adım: Moq Framework’ü bu adresten indiriniz.
 
2.Adım: Bir adet YazilimDeviCom isminde Console Application oluşturunuz.
 
3.Adım: Console uygulamasına bir adet Ders isimli sınıf ekleyelim.
 
 
  1. public class Ders
  2.     {
  3.         public int Id { getset; }
  4.         public string Ad { getset; }
  5.     }
 
4.Adım: Console uygulamasına bir adet IDersDAL isimli interface ekleyelim. Aslına bakarsanız bu interface bizim henüz mevcut olmayan veya kullanamadığımız MakaleDAL’ı temsil edecektir.
 
  1. public interface IDersDAL
  2. {
  3.     List<Ders> PopulerMakaleleriListele(); 
  4. }
5.Adım: Şimdi daha profesyonel çalışmak ve böylesine güzel bir örneği daha gerçekçi kılmak adına Dependency Injection yardımıyla, uygulamamızı daha test edilebilir hale getirelim. Unutmayın kodlarımızı yazarken uymamız gereken kurallardan biri de “Test edilebilir(TEASTABLE)” kodlar yazmaktır. Bir adet DersProcessor isimli sınıf oluşturup Dependency Injection yapıyorum. Böylece yarın öbür gün ben VideoDAL için de ihtiyaç duyarsam aynı yapıyı VideoDAL için de kullanabilirim.
 
  1. public class DersProcessor:IDersDAL
  2.     {
  3.         IDersDAL _dersDAL;
  4.         public DersProcessor(IDersDAL iDersDAL)
  5.         {
  6.             _dersDAL = iDersDAL;
  7.         }
  8.  
  9.         public List<Ders> PopulerMakaleleriListele()
  10.         {
  11.             return _dersDAL.PopulerMakaleleriListele();
  12.         }
  13.     }
 

6.Adım: Bir Adet Test projesi oluşturunuz(YazilimDeviCom.Tests). Add/New Project/Test yolunu kullanınız.

7.Adım: Test projemizle gelen Mevcut sınıfı DersTest olarak değiştirelim ve içini aşağıdaki gibi dolduralım.
 
  1. [TestClass]
  2. public class When_List_Of_Popular_Articles_Returned
  3. {
  4.     List<Ders> makaleListesi = null;
  5.  
  6.     [TestInitialize]
  7.     public void TestSetup()
  8.     {
  9.         makaleListesi = new List<Ders>();
  10.         makaleListesi.Add(new Ders { Id = 1, Ad = "Mocking" });
  11.         makaleListesi.Add(new Ders { Id = 2, Ad = "DI" });
  12.         makaleListesi.Add(new Ders { Id = 3, Ad = "IoC" });
  13.     }
  14.  
  15.     [TestMethod]
  16.     public void Then_It_Should_Have_Three_Articles_In_It()
  17.     {
  18.         Mock<IDersDAL> fakeDersDAL = new Mock<IDersDAL>();
  19.         fakeDersDAL.Setup(dersDal => dersDal.PopulerMakaleleriListele()).Returns(makaleListesi);
  20.         IDersDAL iDersDAL = fakeDersDAL.Object;
  21.         DersProcessor dp = new DersProcessor(iDersDAL);
  22.         Assert.AreEqual(3, dp.PopulerMakaleleriListele().Count);
  23.     }
  24. }
 

Burada Behavior Driven Development(BDD) standartları izlenerek bir test sınıfı oluşturduğumuzu görüyoruz.

Öncelikle test her başladığında bir makale listesi oluşturuyorum. Daha sonra asıl olay Then_It_Should_Have_Three_Articles_In_It isimli test metodumuzda gerçekleşiyor. Burada generic Mock sınıfı vasıtasıyla IDersDAL için mocking yapacağımı bildiriyorum.
 
  1. Mock<IDersDAL> fakeDersDAL = new Mock<IDersDAL>();

Hemen ardından bu sınıfın Setup metodu vasıtasıyla IDersDAL’ın PopulerMakaleleriListele metodunu sanki makaleListesi isimli listeyi döndürüyormuş gibi sahte bir şekilde set ediyoruz.
 
  1. fakeDersDAL.Setup(dersDal => dersDal.PopulerMakaleleriListele()).Returns(makaleListesi); 
 
Artık Dependency Injection yaparak bu metodu kullanıyoruz. Ve tabii ki test başarılı. :)
 
 
Faydalı olması dileğiyle.

Engin Demiroğ,MCT,engin@yazilimDevi.com  

 

 

 


Makale Tagları

Makale Dosyası

Paylaş


Yazar Hakkında
Genel Bilgiler   Yazar Hakkında
Ad: Engin Demiroğ 1985 doğumlu Engin Demiroğ Başkent Üniversitesi Yönetim Bilişim Sistemleri bölümü mezunudur. Lise yıllarından itibaren yazılım teknolojileri ile uğraşmaktadır. Bir çok kurumsal projede çalışmış olan yazarımız şu an İnfopark bünyesinde kamu kuruluşlarına ve özel kuruluşlara yazılım ve veritabanı danışmanlığı hizmeti vermektedir. Yazarımızın uzmanlaştığı alanlar .Net, Sql Server,Sharepoint,Team Foundation Server, Test ve Modellemedir. YazılımDevi.Com'un kurucularından olan Engin Demiroğ YazılımDevi.Com başta olmak üzere bir çok sitede yüzden fazla makale ve video yayını yapmıştır. Aynı zamanda yazarımız bir çok üniversite ve kuruluşta yüzden fazla eğitim ve semineri başarı ile yürütmüştür.
Kurum: İnfopark
Meslek: Yazilim Danışmanı / Eğitmeni
E-Mail: engin@yazilimdevi.com
Web Sitesi: http://www.engindemirog.com
Makale-Video: 206

Bu makale için yapılmış yorumlar

Bu makale hakkında yorum yapınız!...

Bu makale hakkında yorum yapabilmek için lütfen üye olunuz veya giriş yapınız.

Konular

Yazarlar

Son Eklenen Makaleler

Son Eklenen Videolar

Ziyaretçi İstatistiği

ImageOnline : 379         Bugün : 2587

Bu Ay : 52626        Bu Yıl : 298127

Toplam : 680966

Kullanıcı Giriş Paneli!
E-Mail:
Şifreniz:
Giriş Yap

Şifremi Unuttum!
E-Mail:
    Gönder