Asp.net MVC EditorTemplates Kavramı

26 Tem

ASP.NET MVC projelerinde HTML kontrollerine etki edebilmenin bir yöntemi de EditorTemplate oluşturmaktır. Model tarafında tanımlanan bir tipe ait bir property için özel şablon(template) hazırlamak mümkündür. Örneğin bool tipindeki bir değişkene karşılık radio button grubu, checkbox veya combobox oluşturmamızı sağlamaktadır.

Bunu bir örnekle açıklamak daha isabetli olacaktır.

Views/Shared dizini içerisine EditorTemplates adında bir dizin oluşturarak işe başlayabiliriz.

EditorTemplates içerisine de YesNo.cshtml adında bir partial view oluşturauyoruz. Bu partial view ile basit bir şekilde bir bool türüne ait combobox temsil etmeye çalışacağız. Örneğin bir kayıt sırasında kişiden alınan profil tipinin genel veya özel olduğu bilgisini temsil edebiliriz.

Eğer genel seçilirse true, özel seçilirse false dikkate alınacak.

Bu template nasıl kullanılacak?

Template kullanımı için bir model içerisindeki bool tipini UIHint attribute ile imzalamamız gerekecek. UIHint attribute parametresi olarakta template adını giriyoruz.

public class Register
{
     [UIHint("YesNo")]
     [Display(Name="Profil Türü")]
     public bool Accept { get; set; }
}

Bu sayede Register modelini kullanan view sayfalarında @Html.EditorFor(m=>m.Accept) şeklindeki ifadelerin yerine direk SelectList gelecek.

Sonuç:

Asp.net MVC Custom Image Helper

24 Tem

Asp.net mvc uygulamalarında view tarafında kullanılmak üzere kendi özel extension metodlarımızı oluşturabiliriz. Oluşturduğumuz extension metodları da mevcut Html helper tipine bağlayarak rahatlıkla kullanabiliriz.

Html helper tipinde mevcut extension metodlar Action, ActionLink, Label,… şeklinde devam etmektedir. Asp.net mvc takımı, genel ihtiyaçları karşılamak için bu metodları oluşturmuştur. Tüm ihtiyaçlara karşılık verecek metodları da oluşturup sisteme dahil etmeleri de anlamsız ve büyük bir yüktür zaten. İhtiyacımız olan tipleri kendimiz geliştirebilmemiz için bize açık kapı bırakılmıştır.

Bizde bu kapıdan girerek kendi image extension metodumuzu Html helper tipine dahil edelim.

Extension metodlar, statik bir sınıf içerisine statik metodlar halinde tanımlanırlar. Biz de bu şartlara göre Image metodumuzu oluşturabiliriz.


public static class ImageHelper
{
      public static MvcHtmlString Image(this HtmlHelper helper, string imageUrl, string altTag)
      {
            TagBuilder tag = new TagBuilder("img");
            tag.MergeAttribute("src", imageUrl);
            tag.MergeAttribute("alt", altTag);

            return MvcHtmlString.Create(tag.ToString());
      }
}

Artık bu sınıfı view tarafına gösterdiğimizde, @Html.Image(“”,””) şeklinde kullanabiliriz. O halde ImageHelper sınıfını view tarafına nasıl göstereceğimizi inceleyelim.

1.Yol

View sayfasının içerisinde using keywordu ile sınıfın bulunduğu dizini göstermek. View sayfasının  en üstüne @using MyProject.Helpers kodunu yapıştırarak extension metodu kullanmaya başlayabiliriz.

2.Yol

Solution penceresinde ASP.NET MVC projemizin Views dizinindeki web.config dosyası içerisindeki <system.web.webPages.razor>  içerisindeki <namespaces> düğümüne ekleyebiliriz.


<namespaces>
    <add namespace="System.Web.Mvc" />
    <add namespace="System.Web.Mvc.Ajax" />
    <add namespace="System.Web.Mvc.Html" />
    <add namespace="System.Web.Routing" />
    <add namespace="MyProject.Helpers" />
</namespaces>

Bu yöntemi uyguladığımızda ilk etapta kodun kullanımı sırasında, extension metodumuzun altını kırmızı olarak çizebilir. Ancak kod çalışır. Eğer visual studio restart edilirse artık extension metodun altı çizilmeyecektir. Bu sorun intellisense tarafına kodumuzun web.config tarafından dahil olamadığındn kaynaklanıyor.

Kodun kullanımı:

@Html.Image(“../Content/Images/flower.jpg”,”flower”)

Sonuç:

Asp.net Globalization Ayarları

18 Tem

Asp.net projelerimizi yayınladığımızda bazen türkçe karakter sorunlarıyla karşılaşabilmekteyiz. Bu yazıda anlatmak istediğim Türkçe karakter sorununda ziyade geliştirme yaptığımız bilgisayarlar ile sunucular arasındaki kültür farkından kaynaklanabilecek sorunlar hakkında olacak.

Örneğin kendi makinamız türkçe işletim sistemli ve sunucumuz da yurt dışında. Bu durumda hem türkçe karakter sorunu, hem de tarihsel farklardan dolayı oluşabilecek tarih format farklılıkları gibi sorunlarla karşılaşabilmekteyiz. Bu durumu aşmak için yapmamız gereken web.config dosyası içerisindeki system.web alanına bir globalization ayarını düzenlemektir.


<system.web>
<globalization culture="tr-TR" />

Bu durumda kültük farkından kaynaklanan sorunlardan kurtulabilmekteyiz.

Eğer ASP.NET MVC projesi ile geliştirme yapıyorsak, Default model binder, kültür farkından dolayı tarih formatlarındaki property’leri set edemiyor. Böyle bir sorunu da bu şekilde aşabilmekteyiz.

Asp.net mvc meta description türkçe karakter sorunu

11 Tem

Asp.net mvc ile geliştirdiğim uygulamalarda seo konusuna geldiğimde karşılaştığım bir sorunu da meta etiketlerinin açıklamalarının dinamik olarak oluşturmaya çalıştığımda karşıma çıkar karakter sorunuydu. Bu sorunu, HTML encoding yüzünden yaşadığımı düşünüyorum.

<!DOCTYPE html>
<html lang="tr">
<head>

<title>@ViewBag.Title</title>

<meta name="description" content="@(MvcHtmlString.Create(ViewBag.Description))"/>

Normalde meta description içerisinde “sürü” yazmalıydı ama yazmıyor işte.

Bu sorunu düzeltmek için meta description kısmında küçük bir değişiklik yaparak şu şekle getirdiğimde sorun ortadan kalkıyor.

<meta name="description" content="@(Html.Raw(ViewBag.Description))"/>
[code]

ve sonuç aşağıdaki gibidir.
[code language="xml"]<meta name="description" content="sürü" />

Aslında burada karşılaştığımız sorun razor view engine tarafından alınmış bir güvenlik önlemi. Yani bir kullanıcı, sayfamınız yorum kısmına sürekli alert veren bir javascript kodu yazdığında, bu yorum Html tarafında direk render edilirse, sayfa her açıldığında kullanıcıların karşısına alert veren bir pencere çıkacaktır.

Bu tarz javascript ataklarını önleyebilmek için, helper sınıfları ve metodları kullanılır genelde. Örneğin yukarda kullanılan Html.Raw metodu yardımı ile bu içeriğin ne olduğunu bildiğimizi belirtiyor ve html olarak render edilmesini istiyoruz.

Aslında kıllanabileceğimiz bir kaç tane yöntem  var. Şu şeklide sıralayabiliz.

1- <meta name="description" content="@(ViewBag.Description)"/>
2- <meta name="description" content="@(MvcHtmlString.Create(ViewBag.Description))"/>
3- <meta name="description" content="@(new MvcHtmlString(ViewBag.Description))"/>

Bu yöntemlerin hepsinin temelinde yatan IHtmlString arayüzünün ToHtmlString() metodudur.

Tekrar görüşmek ümidiyle.

Asp.Net MVC Gzip/Deflate Sıkıştırılmış (Compressed) içerik

15 May

Web sayfalarımızın içeriği genişledikçe, sunucu tarafından oluşturulan cevapların(response) boyutu artmaktadır. Bu boyutu küçültmenin yolu içeriği sıkıştırmaktır.

Bu işlemi incelemek için senaryomuzda, içeriği binlerce kelimeden oluşan bir sunucu cevabı (response) oluşturup,  kullanıcı(client) tarafına sunalım. Bu işlemi önce normal bir şekilde, ardından da sıkıştırılmış bir şekilde gerçekleştirelim ve farkı görelim.

ASP.NET MVC ortamında çalıştığımız için önce bir action metod oluşturup içeriğini doldurarak sunalım ve boyutuna bakalım.


public ActionResult Zip()
{
     StringBuilder result = new StringBuilder();

     for (int i = 0; i < 42000; i++)
     {
          result.Append("word");
     }

     return Content(result.ToString());
}

Yukarıdaki action metod ile 42000 kelimeyi içeren bir içeriği kullanıcıya sunuyoruz. Bu içeriğin boyutuna Firefox tarayıcısında Firebug eklentisiyle bakalım.

Sıkıştırılmamış içerik

Evet içerin 164.1KB boyutunda oluşturulmuş durumda.

Şimdi bu işlemi, içeriği sıkıştırarak yapmayı deneyelim. Önce sıkıştırılacak action metod veya controller sınıfını sıkıştırmaya yarayan bir attribute oluşturalım. Daha sonra sıkıştırmak istediğimiz metodu bu attribute ile imzalayabiliriz.

public class CompressAttribute: ActionFilterAttribute
{
      public override void OnActionExecuting(ActionExecutingContext filterContext)
      {
          var encodingAccept = filterContext.HttpContext.Request.Headers["Accept-Encoding"];

          if (string.IsNullOrEmpty(encodingAccept))
              return;

          encodingAccept = encodingAccept.ToLowerInvariant();

          var response = filterContext.HttpContext.Response;

          if (encodingAccept.Contains("gzip"))
          {
              response.AddHeader("Content-encoding", "gzip");
              response.Filter = new GZipStream(response.Filter, CompressionMode.Compress);
          }
          else if (encodingAccept.Contains("deflate"))
          {
              response.AddHeader("Content-encoding", "deflate");
              response.Filter = new DeflateStream(response.Filter, CompressionMode.Compress);
          }

      }

}

Şimdi oluşturduğumuz bu attribute ile metodumuzu imzalayıp tekrar içerik boyutuna bakalım.

[Compress]
public ActionResult Zip()
{
      StringBuilder result = new StringBuilder();

      for (int i = 0; i < 42000; i++)
      {
           result.Append("word");
      }

      return Content(result.ToString());
}

Gzip sıkıştırılmış içerik

İçerik 1.9KB boyutuna düştü. Sıkıştırma işleminden önceki içerik 164.1KB idi. Bence bu müthiş birşey.

Tekrar görüşmek ümidiyle…

ASP.NET MVC ile Dosya okuma ve yazma işlemleri

14 May

Web ortamında bazı durumlarda dosyalarla işlem gerektiren durumlar olabilmektedir. Örneğin bir HTML sayfa, CSS dosyası, Text dosya veya şu anda aklıma gelmeyen bir çeşit dosyanın içeriğinin online olarak değiştirilmesi gibi.

Bu işlemi, ASP.NET MVC ortamında nasıl gerçekleştirebileceğimizi inceleyelim. Bu işlem için dosyalarımızın bulunduğu bir dizini belirleyip içindeki dosyaları kullanıcının önüne döküp, istediği gibi düzenlemesini sağlamaya çalışalım.

Dizin içindeki dosyaları kullanıcıya veren bir model sınıfı oluşturalım.


public class PersonelFiles
{
      public string FileName { get; set; }
}

Bu model sınıfından üretilen bir view oluşturmak için File controller içerisine Files adında bir action metod oluşturalım.


public class FileController : Controller
{
      public ActionResult Files()
      {
         DirectoryInfo directory = new DirectoryInfo(Server.MapPath("~/Files"));

         var personelFiles = new List<PersonelFiles>();

         foreach (var item in directory.GetFiles("*.txt"))
         {
             personelFiles.Add(new PersonelFiles { FileName = item.Name });
         }

         return View(personelFiles);
     }
}

Files dizinindeki *.txt uzantılı dosyalarımızı listeleyecek bir view artık bu action metod üzerinden oluşturulabilir. Files() action metoduna sağ tıklayıp create view diyerek ilerleyebiliriz.

Şimdi de dosyaların içeriğini editleme işlemini gerçekleştirmek için, düzenle linkine tıklandığında dosya içeriğini bir kutu içerisinde bize sunacak action metodu yazalım.

Metod adı Edit şeklinde olacaktır.


public ActionResult Edit(string id)
{
     if (!string.IsNullOrEmpty(id))
     {
         StreamReader reader = new StreamReader(Server.MapPath("~/Files/") + id, System.Text.Encoding.Default);

         var content = new FileEditFormView()
         {
             FileContent = reader.ReadToEnd(),
             FileName = id
         };

         reader.Close();
         reader.Dispose();

         return PartialView("_Edit", content);
     }

     return View("FileNotFound");

}

Edit modtodu, düzenle linkine tıkladığımızda linkteki id parametresiyle dosya adını Edit metoduna verecektir. dosya içeriği okundukran sonra  FileEditFormView şeklinde karşımıza gelecektir.

Kaydet butonuna bastığımızda da POST metodu ile gönderdiğimizde de yazma işlemini gerçekleştireceğiz.


[HttpPost]
public ActionResult Edit(FileEditFormView form)
{
      StreamWriter writer = new StreamWriter(Server.MapPath("~/Files/") + form.FileName, false, System.Text.Encoding.Default);

      writer.Write(form.FileContent);
      writer.Close();
      writer.Dispose();

      return RedirectToAction("Files");
}

Bu şekilde işlem tamamlanmış olacaktır.

Düzenleme Geçmişi:

Başlık düzenlendi 25.09.2013
İçerik düzenlendi 25.09.2013

ASP.NET MVC Reset Password

7 May

Bir çok web sitesinin klasik bölümüdür şifremi unuttum bölümü. Kullanıcı adınızı veya email adresinizi girersiniz ve mail adresinize postalanır yeni şifreniz. Peki bu senaryo ASP.NET  MVC ile Membership yapısı kullanılarak nasıl yapılır? Yani kullanıcı şifresi resetlenir (reset password) ve yeni şifre mail olarak gönderilir.

Bu işlem için önce sistemimizin konfigurasyonunu mail gönderebilecek şekilde hazırlamamız gerekmektedir.


<system.net>
    <mailSettings>
       <smtp deliveryMethod="Network">
         <network host="mailhostadresiniz" (örneğin smtp.gmail.com)
                  port="587"
                  userName="emailadresiniz"
                  password="sifreniz"
                  enableSsl="true"/> (SSL gerektiren mail sunucu kullanıyorsanız)

       </smtp>
    </mailSettings>
</system.net>

Sistemimiz mail gönderemeye hazır bir vaziyete gelmiş durumda.

ASP.NET MVC projemizde Models dizinindeki Account model içerisine yeni bir model tanımlamalıyız. Bu modelin adı LostPasswordModel olacak.


public class LostPasswordModel
{
     [Required(ErrorMessage = "Kullanıcı adınızı giriniz.")]
     [Display(Name="Kullanıcı Adı")]
     public string Username { get; set; }
}

Bu model ile kullanıcıdan kullanıcı adını talep ederek mail adresine yeni şifresini göndereceğiz.

Bu modelden gelen kullanıcı adını alarak o kullanıcının şifresini sıfırlayıp, yeni mail adresine postalamalıyız. Bu işlemi yapmak için aşağıdaki metodu tanımlayabiliriz.

public void ResetPassword(string username)
{

     MembershipUser user = Membership.GetUser(username);

     string confirmationGuid = user.ProviderUserKey.ToString();
     string newPassword = user.ResetPassword();
     string bodyMessage = string.Format("Yeni Şifreniz {0}",newPassword);

     var message = new System.Net.Mail.MailMessage("kimden@mail.com", user.Email)
     {
         Subject = "Yeni şifre oluşturma isteği.",
         Body = bodyMessage
     };

     var client = new System.Net.Mail.SmtpClient();
         client.Send(message);
}

Bu metod sayesinde kullanıcının mail adresine yeni şifresini postalamış olduk.

ASP.NET MVC Email Doğrulama (Verification)

6 May

ASP.NET üyelik sistemlerinde bir gelenek olan üyelerin email adreslerini doğrulama işleminden bahsedelim birazda. Sistemimize üye olanları email adresleri aracılığıyla gerçek kullanıcı olup olmadıklarını anlayabiliriz bu sayede. Bu işlem için sistemin konfigurasyonlarının mail gönderebilecek hale getirilmesi gerek. Yani mail ayarları yapılmalıdır.


<system.net>
   <mailSettings>
      <smtp deliveryMethod="Network">
           <network host="mailhostadresiniz" (örneğin smtp.gmail.com)
                    port="587"
                    userName="emailadresiniz"
                    password="sifreniz"
                    enableSsl="true"/> (SSL gerektiren mail sunucu kullanıyorsanız)
      </smtp>
   </mailSettings>
</system.net>

Bu ayarlar yapıldıktan sonra üyelerin kayıtlarının yapıldığı sırada bir doğrulama postasının otomatik olarak gönderilmesi gerekir. Bu işlemi yapan metodu hazırlamalıyız.


public void SendConfirmationEmail(string username)
{

      MembershipUser user = Membership.GetUser(username);

      string confirmationGuid = user.ProviderUserKey.ToString();
      string verifyUrl = System.Web.HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority) +
                         "/Account/Verify?Id=" +
                         confirmationGuid;

      string bodyMessage = string.Format("üyeliğiniz başarıyla oluşturulmuştur. Aşağıdaki linke tıkladığınızda hesabınızın aktif olacaktır.\n");
             bodyMessage += verifyUrl;

      var message = new System.Net.Mail.MailMessage(Models.Configuration.SystemMail, user.Email)
      {
          Subject = "Üyeliğinizi doğrulayın.",
          Body = bodyMessage
      };

     var client = new System.Net.Mail.SmtpClient();
         client.Send(message);

}

Mail gönderen metodumuz da artık hazır olduğuna göre bu metodu kayıt işlemi sırasında kullanabiliriz.


[HttpPost]
public ActionResult Register(RegisterModel model)
{

   if (ModelState.IsValid)
   {
       MembershipCreateStatus createStatus = MembershipService.CreateUser(model.UserName, model.Password, model.Email, false);

       if (createStatus == MembershipCreateStatus.Success)
       {
            SendConfirmationEmail(model.UserName);

            return RedirectToAction("Confirmation","Account");
       }
       else
       {
            ModelState.AddModelError("", AccountValidation.ErrorCodeToString(createStatus));
       }

    }

    return View(model);

}

Artık kayıt olan üyelere otomatik olarak mail gönderiliyor.

Bu linke tıklandığında, üye Account controller içindeki Verify action metoduna yönlendirilecektir.


public ActionResult Verify(string Id)
{
     MembershipUser user = Membership.GetUser(new Guid(Id));

     user.IsApproved = true;
     Membership.UpdateUser(user);

     return RedirectToAction("Welcome");
}

Bu action metod sayesinde linke tıklayan üyenin üyeliği aktif hale getirilmiş oldu.

ASP.NET MVC Ajax.ActionLink ile sayfa yenilemeye son

30 Nis

İnternet sayfalarında artık yeni teknolojilerle birlikte javascript’in gücü iyice gösterilmeye başlandı. Sayfa yenilemeleri yapmak yerine sadece javascript ile sayfa üzerindeki etiketler(div) güncellenmekte. Linklere, butonlara tıklandığında istenen sonuçlar etkili bir biçimde bizi rahatsız etmeden önümüze dökülmekte. Son zamanlarda özellikle sosyal paylaşım sitelerinde javascript kendini o kadar belli ediyor ki, javascript’i icat edenler bile birgün bu kadar kullanılacağını tahmin etmemiştir.

Lafı fazla uzatmadan javascript özelliğini, liklere tıklandığında sayfa yenilemesi yapmadan önümüze getiren özelliği ASP.NET MVC mimarisinde kullanmaya çalışacağız.

Bir restorantın menü listesini önümüze getiren bir senaryomuz olduğunu varsayalım. Menü listesinde ürün adı ve fiyatı olsun. Bu yapıyı temsilen bir Menu adında sınıf oluşturmalıyız.


public class Menu
{
      public int Id { get; set; }
      public string Name { get; set; }
      public decimal Price { get; set; }
}

Şimdi MenuController adında bir controller sınıfı oluşturup bu controller sınıfının Index metodu ve Index view sayfası oluşturalım.


public class MenuController : Controller
{
      List<Menu> menu = new List<Menu>
      {
           new Menu{Id =1, Name="Hamburger", Price=3.15M},
           new Menu{Id =2, Name="Cheeseburger", Price=4.05M},
           new Menu{Id =3, Name="Cola", Price=2.0M},
           new Menu{Id =4, Name="Cips", Price=1.25M},
      };

      public ActionResult Index()
      {
           return View();
      }

      public ActionResult GetMenu()
      {
           return PartialView("_MenuPart", menu);
      }

}

Menu Listesi linkine tıklandığında sayfa yenilenmeksizin yukardaki liste tablo halinde linkin aldına indirilacek.

Bunun için yapılacak hazırlıklardan biri jquery.unobtrusive-ajax.min.js dosyasının view sayfasına referans edilmesi gerekmektedir. Aksi taktirde yaptığımız işlem çalışmayacaktır. Bu söylediklerim ASP.NET MVC3 için geçerli tabiki.

Referans olarak ana Layout sayfasına ekliyorum javascript dosyasını.

Şimdi Index view sayfası içine “Menu Listesi” linkini oluşturmalıyız.


@Ajax.ActionLink("Menu Listesi",
                 "GetMenu",
                 new AjaxOptions{
                                 InsertionMode=InsertionMode.Replace,
                                 UpdateTargetId="MenuBox",
                                 HttpMethod="GET",

                 })

<div id="MenuBox"></div>

Ajax helper sınıfının ActionLink Extension metodu ile link oluşturma işlemini gerçekleştirebiliriz. Bu metodun aldığı AjaxOptions parametresinde belirtilen, InsertionMode özelliği Replace olarak işaretlenir. Bu sayede işlem sonrasında, yani GetMenu metodundan dönen değeri UpdateTargerId parametresindeki html element içeriği ile değiştirileceğini belirtiyoruz.

Örneğimizde GetMenu metodu bir _MenuPart adında bir PartialView döndürüyor.

_MenuPart partial view içeriği ise şu şeklide olacaktır.


<table>
    <tr>
         <th>Name</th>
         <th>Price</th>
         <th></th>
    </tr>
    @foreach (var item in Model) {
    <tr>
        <td>@Html.DisplayFor(modelItem => item.Name)</td>
        <td>@Html.DisplayFor(modelItem => item.Price)</td>
        <td>@Html.ActionLink("Edit", "Edit", new { id=item.Id }) |
            @Html.ActionLink("Details", "Details", new { id=item.Id }) |
            @Html.ActionLink("Delete", "Delete", new { id=item.Id })
       </td>
    </tr>
    }

</table>

Sonuç olarak Index sayfasındaki Menu Listesi linkine tıklandığında bu tablo önümüze gelecek.

Asp.net MVC JsonResult Tipli Metodlar İçin Unit Test

24 Nis

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…