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:
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