ASP.NET MVC mimarisi üzerinde test güdümlü çalışırken karşılaşacağımız test tiplerinden biri de JsonResult tipindeki action metodların testidir. Test tipinde veri döndüren metodların testleri kolay olabilmektedir. Ancak JsonResult tipindeki metodlar veriyi JSON tipine dönüştürerek sunduğu için, metod tarafından bize sunulan veriler text şeklinde olmayacaktır.
Normalde önce test metodu yazılarak gidilmelidir ancak burada test kodu geliştirmeyi konu almadığımız için, yazılmış metodu test ederek ilerlemeye çalışalım.
Test edilecek metod şu şekilde belirlenebilir.
public JsonResult GetMenu() { var menu = new List<Menu> { new Menu{ MenuID=1, MenuName="Hamburger, Cola, Cips"}, new Menu{ MenuID=2, MenuName="Cheeseburger, Cola, Cips"}, new Menu{ MenuID=3, MenuName="Pizza, Cola, Cips"} }; return Json(menu,JsonRequestBehavior.AllowGet); }
Yemek menüsünü JSON formatında sunan bir metod.
Bu metodun test edilmesi sırasında aslında bazı sorulara yanıt arıyoruz olacağız. Bir başka deyişle önce test metodunun yazıldığı senaryolarda iddalar doğrulanarak gidilir. Bizim senaryomusda ise GetMenu metodunun:
- Tipinin JsonResult olduğu iddası
- Boş veri döndürmediği iddası
- Dönen verinin formatının ne olacağının iddası
ortaya atılarak doğrulanmaya çalışılmıştır.
[TestMethod] public void GetMenu_ShouldReturn_JSON() { // Arrange HomeController controller = new HomeController(); // Act var result = controller.GetMenu() as JsonResult; // Assert Assert.IsInstanceOfType(result, typeof(JsonResult)); Assert.IsNotNull(result.Data); }
İlk iki iddamızı bu metod sayesinde dğrulayabiliriz. Bu test başarıyla geçecektir. Ancak metodun döndürdüğü verinin ne olduğunu veya string şeklinde alınıp şuna eşittir denilebilmesi için serileştirilme işleminden geçirilmelidir. Çünkü result.Data nesnesi object tipindedir, ve içeriği okunamaz durumdadır. Serileştirilme işlemi sonrasında işlenebilir bir somut veri elde edilebilir.
Assert.AreEqual("", result.Data.ToString());
Şeklinde bir idda hata döndürecektir. Test Fail duruma düşecektir.
Aşağıdaki lekilde serileştirme işlemini gerçekleştirdiğimizde bu tür sorunlarla karşılaşmayacağız.
[TestMethod] public void GetMenu_ShouldReturn_JSON() { // Arrange HomeController controller = new HomeController(); // Act var result = controller.GetMenu() as JsonResult; var serializer = new JavaScriptSerializer(); var output = serializer.Serialize(result.Data); // Assert Assert.IsInstanceOfType(result, typeof(JsonResult)); Assert.IsNotNull(result.Data); Assert.AreEqual(@"[{""MenuID"":1,""MenuName"":""Hamburger, Cola, Cips""}, {""MenuID"":2,""MenuName"":""Cheeseburger, Cola, Cips""}, {""MenuID"":3,""MenuName"":""Pizza, Cola, Cips""}]", output); }
Tekrar görüşmek dileğiyle…