Asp.net MVC projesinde Unit Test yazmak

Temelde Asp.net MVC projesine unit test yazarken izleyeceğimiz aşamalar birbirleriyle benzer ;

1) Test Metodu ile Viewbag’e Erişim

Action metod içerisinden view bag ile view’a gönderilen verilere test metodunda result değişkeninin viewbag özelliğiyle erişebiliriz. Dolayısıyla aşağıdaki action metodundaki viewbag’e bir aşağısındaki test metodunda olduğu gibi erişebilirz.

Aşağıdaki test sonucu başarılı olarak dönecektir.

 public ActionResult Index()
 {
   ViewBag.Isim = "Cagatay KIZILTAN";

   return View();
 }
 [TestMethod]
 public void IndexTest()
 {
   HomeController controller = new HomeController();

   ViewResult result = controller.Index() as ViewResult;

   string isim = result.ViewBag.Isim;

   Assert.AreEqual("Cagatay KIZILTAN", isim);
}

2) Test Metodu ile View’a Gönderilen Modele Erişim

Viewa göndermek üzere Urun adında aşağıdaki gibi bir modelimiz olsun. Bir aşağısında da controllerin içerisinde tanımladığımız action metodumuz. Yaptığı iş modeli view’a göndermek. İstediğimiz şey de view’a gönderilen bu modele test metodu üzerinde erişmek.

 public class Urun
{
  public int Id { get; set; }

  public string Ad { get; set; }

  public double Fiyat { get; set; }

}
 public ActionResult Urun(int id)
 {
   var urun = new Urun { Id = 1, Ad = "Bilgisayar", Fiyat = 1000 };

   return View("Urun", urun);

 }

İlk olarak controller sınıfına ait bir nesne oluştururuz ve bu nesne üzerinden action metodumuzu parametresi ile çağırırız. Controllerın action metodunun içeriğine ulaşabilmek için actionmetodu viewResult olarak sonuç değişkenine atarız. Daha sonra da aşağıdaki gibi sonuç değişkeninin model özelliğini cast ederek modele ulaşabiliriz.

[TestMethod]
 public void Urun_KayitVar()
 {
   var controller = new HomeController();

   var sonuc = controller.Urun(1) as ViewResult;

   var urun = (Urun)sonuc.Model;

  Assert.AreEqual("Bilgisayar", urun.Ad);

 }

3) Test Metodu ile View’dan Farklı Bir View’a Yönlenme (RedirectToAction) Durumunda Erişim

Aşağıdaki action metodumuz, eğer ıd 0 dan küçükse anasayfaya yani index actionuna redirect olarak geri döner.  0’dan büyük ise Ürün view’ına modeli gönderir. Biz test casei olarak idnin 0dan küçük olması durumu için bir test metodu yazmak istiyoruz.

 public ActionResult Urun(int id)
{
  if (id <= 0)
   return RedirectToAction("Index");

  var urun = new Urun { Id = 1, Ad = "Bilgisayar", Fiyat = 1000 };

  return View("Urun", urun);

}

Contoller classının bir nesnesi oluşturulur ve bunun üzerinden ilgili metoda 0dan küçük bir Id parametresi verilir. Action dönüşünü cast edeceğimiz tip returnden dönüş olarak beklediğimiz tiptir. Yani yukarıda bize return metodumuz RedirectToAction metodunu  dönecekse ki RedirectToAction metodun ismi olmakla birlikte dönüş tipi RedirectToRouteResulttır. Biz de sonuc değişkenimizi RedirectToRouteResult’a cast etmeliyiz. Daha sonra RouteValues[“action”] ile yönleneceği action üzerinden test metoduna devam edebiliriz.

Aşağıdaki test başarılı sonuç dönecektir.

 [TestMethod]
 public void Urun_IdSifirdanKucuk()
 {
   var controller = new HomeController();
   var sonuc = controller.Urun(-1) as RedirectToRouteResult;

   Assert.AreEqual(sonuc.RouteValues["action"], "Index");
 }

4) Test Metodu ile View İsmine Erişim

Bazı zamanlar Action metot kendi viewının dışında viewlara da yönlenebilir. Bu gibi durumlar için de test metotları yazabiliriz.

 public ActionResult Yönlen()
 {
   return View("Index2");

 }

Yapacağımız şey her zaman olduğu gibi controller sınıfına ait bir nesne oluşturup bu nesne üzerinden ilgili metodumuzu ilgili dönüş tipine cast etmektir. Daha sonra sonuç değişkeni üzerinden ViewName özelliği ile action metodun yönleneceği view ismine erişebiliriz. Buradaki önemli ayrım ViewName özelliği ile action metodun kendi viewına değil yönleneceği viewa ulaşıyor olmamızdır.

Aşağıdaki test başarılı sonuç dönecektir.

 [TestMethod]
 public void Yönlen_ViewName()
 {
   HomeController controller = new HomeController();
   ViewResult sonuc = controller.Yönlen() as ViewResult;

   Assert.AreEqual(sonuc.ViewName, "Index2");

 }

5) Test Metodu ile Action’ın Modelinin Veri Türüne Erişim

Bazen action metodun view’a gönderdiği verinin tipi üzerinden de testler yapmak isteyebiliriz. Bu gibi durumlarda aşağıdaki metot yapısını kullanmamız yeterli olacaktır.

 public ActionResult Urunler()
 {
   return View(new List<Urun>());
 }

Aşağıda model türünün verdiğimiz tiple olan uygunluğunu test ediyoruz.

Aşağıdaki metodun test sonucu başarılı olarak dönecektir.

 [TestMethod]
 public void Urunler_Liste()
 {
   HomeController controller = new HomeController();
   ViewResult sonuc = controller.Urunler() as ViewResult;

   Assert.IsInstanceOfType(sonuc.Model, typeof(List<Urun>));

 }

6) Test Metodu ile Actionunun Geri Dönüş Türüne Erişim

Action metotlardan farklı türlerde geri dönüş sağlayabilirsiniz. Bu geri dönüşler ViewResult, RedirectToActionResult gibi türler olabilir. Bu gibi türlerin testi için controllerdan ilgili metodu çağırıp onu test etmek istediğimiz dönüş tipinin typeof() metoduyla  IsInstanceOfType üzerinden karşılaştırmamız yeterli olacaktır.

 public ActionResult Urun(int id)
 {
   if (id <= 0)
    return RedirectToAction("Index");

    var urun = new Urun { Id = 1, Ad = "Bilgisayar", Fiyat = 1000 };

   return View("Urun", urun);

 }
 [TestMethod]
 public void Urun_DonusTipi()
 {
   HomeController controller = new HomeController();

   Assert.IsInstanceOfType(controller.Urun(-1), typeof(RedirectToRouteResult));
 }

 [TestMethod]
 public void Urun_DonusTipi()
 {
   HomeController controller = new HomeController();

   Assert.IsInstanceOfType(controller.Malzeme(3), typeof(ViewResult));
 }

7) Test Metodu ile Json Türündeki Verilerin Testi

Controllerdaki json türünde dönülen verinin bilgileri dönülen modeldeki Data propertisinde tutulmaktadır. Bu sebeple biz de test metodunda veriye ulaşırken elimizdeki nesnenin .data propertysini propertynin gerçek tipine cast ederek ulaşabiliriz.

 public JsonResult JsonUrun()
 {
    var urun = new Urun

       Id=1,
       Ad = "Bilgisayar",
      Fiyat = 2000
    };

   return Json(urun);
 }

Aşağıda controller classına ait bir nesne oluşturulduktan sonra bu nesne üzerinden ilgili metot çağırılmıştır. Bu metot çağırıldıktan sonra geri dönen bilgi nesnenin data propertisindedir. Bu veriyi gerçek tipine cast ettikten sonra normal test süreçlerine aynı şekilde devam edebiliriz.

 [TestMethod]
 public void UrunJson_Test()
 {
   HomeController  controller = new HomeController();
   
   var urun = controller.JsonUrun();
   var sonuc = urun.Data as Urun;
   var olmasiGereken = new UrunId=1, Ad = "Bilgisayar",  Fiyat = 2000};

   Assert.AreEqual(sonuc.Id,olmasiGereken.Id);
   Assert.AreEqual(sonuc.Ad,olmasiGereken.Ad);
   Assert.AreEqual(sonuc.Fiyat,olmasiGereken.Fiyat);

 }

You may also like...

2 Responses

  1. Zeus dedi ki:

    benim için çok faydalı bir yazı oldu. teşekkürler

  2. Onur dedi ki:

    Gerçekten çok teşekkürler emeginize saglık bu konuda türkçe kaynak bulmak epey bi zor.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir