29 Temmuz 2013 Pazartesi

Asp.net MVC Birim Testleri Yazarken Session’ı Taklitleme(Mocking)


Merhaba,

Bu blog girdisinde aspnet mvc projelerinde controller’a birim testleri yazarken karşımıza çıkan bir probleme çözüm getirmeye çalışacağım: Session’ın taklit edilmesi.

Aspnet MVC Framework’ü günümüz yazılım gerekliliklerinden biri olan”test edilme” özelliği gözetilerek geliştirildiği için controller, model vs üzerine kolayca birim testleri yazılabilir. Fakat HttpSession, QueryString, HttpContext gibi temel tiplerin kullanıldığı senaryolara yönelik test yazarken, bu tiplerin taklit edilmesi başlı başına bir iş olabiliyor. Çünkü test ortamında controller’ın nesnesini oluşturduğunuzda maalesef HttpContext, Request vs gibi web ortamından doğan bağımlılıkların değeri atanmamıştır:

    Örnek bir test senaryosu üzerinden gidelim:

    “Diyelimki sitemize giren üyelerin id’sini oturum açtıklarında session’da saklıyoruz ve oturum kapatma işleminde de session’dan bu değeri siliyoruz. Bu durumda oturum kapatmaya dair bir birim testi yazıyor olalım: üye oturumunu kapattığında session temizlenmelidir”.
   
Logout işlemini yapan HomeController’ın altındaki Logout action’ı:
public ActionResult Logout()         
{             
       Session["userId"] = null;             
       return RedirectToAction("Login", "Home");        
}
Yukarıdaki senaryoya göre hemen şöyle bir kontroller testi yazarız:
NullReferenceException hatası almamız dolayısıyla testi geçemekdik. Çünkü daha önce de belirttiğim üzere örneklediğimiz controller nesnemizin context’i null. Bu durumda devreye girerek ilgili bağımlılıkları taklit nesnelerle bizim enjekte etmemiz gerek:
Burada session’ı ve bağlı olduğu context sınıfını moq kütüphanesini kullanarak taklit ettik. Görüldüğü üzere sadece session’a bağlı bir değeri test etmek için “arrange(hazırlık, ayarlarma)” bloğumuz ne kadar büyüdü. “Keşke bu taklit işlemini bizim yerimize yapan bir yapı olsa” dediğinizi duyar gibiyim :] Evet, bu noktada MVCContrib TestHelper kütüphanesi yardımımıza koşuyor. Açık kaynak kodlu projeyle alakalı bilgiye CodePlex üzerinden ulaşabilirsiniz: http://mvccontrib.codeplex.com/wikipage?title=TestHelper. Yine nuget konsolundan “Install-Package MvcContrib.Mvc3.TestHelper-ci” komutuyla kütüphaneyi test projenize dahil edebilirsiniz. MVCContribTestHelper mvc birim testleri sırasında izolasyon sebebiyle elle tek tek taklit etmemiz gereken HttpContext, Sesion gibi temel web sınıflarını bizim yerimize taklit eder. Şimdi bir de aynı testi MVCContribTestHelper yardımıyla yazıp farkı görelim:
Görüldüğü üzere HttpContext ve Session nesnelerini bir satir kodla [ new estControllerBuilder().InitializeController(controller) ] halletmiş olduk üstelik daha okunabilir ve amaca odaklı bir test kodu elde etmiş olduk. MVCContribTestHelper kütüphanesinin taklit kolaylıklarının yanında yönlendirme doğrulamaları vs. için de yardımcı metotlar var incelemenizi öneririm.

TDD ile yazılım kalitenizi doruğa çekmeniz dileklerimle, temiz kodlamalar :]

Hiç yorum yok:

Yorum Gönder