Share via


ASP.NET MVC Uygulamaları için Birim Testleri Oluşturma (C#)

tarafından Stephen Walther

Denetleyici eylemleri için birim testleri oluşturmayı öğrenin. Bu öğreticide Stephen Walther, bir denetleyici eyleminin belirli bir görünümü döndürdüğü, belirli bir veri kümesini döndürdüğü veya farklı türde bir eylem sonucu döndürdüğü testinin nasıl yapılacağını gösterir.

Bu öğreticinin amacı, ASP.NET MVC uygulamalarınızdaki denetleyiciler için birim testleri nasıl yazabileceğinizi göstermektir. Üç farklı tür birim testi oluşturmayı ele alıyoruz. Bir denetleyici eylemi tarafından döndürülen görünümü test etmeyi, bir denetleyici eylemi tarafından döndürülen Verileri Görüntüle eylemini test etmeyi ve bir denetleyici eyleminin sizi ikinci bir denetleyici eylemine yönlendirip yönlendirmediğini test etmeyi öğreneceksiniz.

Test Altında Denetleyici Oluşturma

Test etmek istediğimiz denetleyiciyi oluşturarak başlayalım. adlı ProductControllerdenetleyici, Liste 1'de yer alır.

Listeleme 1 – ProductController.cs

using System;
using System.Web.Mvc;

namespace Store.Controllers
{
     public class ProductController : Controller
     {
          public ActionResult Index()
          {
               // Add action logic here
               throw new NotImplementedException();
          }

          public ActionResult Details(int Id)
          {

               return View("Details");
          }
     }
}

ve ProductControllerDetails()adlı Index() iki eylem yöntemi içerir. Her iki eylem yöntemi de bir görünüm döndürür. Eylemin Details() Id adlı bir parametre kabul ettiğini göreceksiniz.

Denetleyici tarafından döndürülen Görünümü Test Etme

öğesinin doğru görünümü döndürip döndürmediğini test etmek istediğimizi ProductController düşünün. Eylem çağrıldığında ProductController.Details() Ayrıntılar görünümünün döndürülmesini sağlamak istiyoruz. Listeleme 2'deki test sınıfı, eylem tarafından ProductController.Details() döndürülen görünümü test eden bir birim testi içerir.

Listeleme 2 – ProductControllerTest.cs

using System.Web.Mvc;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Store.Controllers;

namespace StoreTests.Controllers
{
     [TestClass]
     public class ProductControllerTest
     {
          [TestMethod]
          public void TestDetailsView()
          {
               var controller = new ProductController();
               var result = controller.Details(2) as ViewResult;
               Assert.AreEqual("Details", result.ViewName);

          }
     }
}

Listing 2'deki sınıfı adlı TestDetailsView()bir test yöntemi içerir. Bu yöntem üç kod satırı içerir. İlk kod satırı sınıfının yeni bir örneğini ProductController oluşturur. İkinci kod satırı denetleyicinin Details() eylem yöntemini çağırır. Son olarak, son kod satırı eylem tarafından Details() döndürülen görünümün Ayrıntılar görünümü olup olmadığını denetler.

özelliği, ViewResult.ViewName bir denetleyici tarafından döndürülen görünümün adını temsil eder. Bu özelliği test etmeyle ilgili büyük bir uyarı. Denetleyicinin görünüm döndürmesi için iki yol vardır. Denetleyici açıkça şuna benzer bir görünüm döndürebilir:

public ActionResult Details(int Id)
{
     return View("Details");
}

Alternatif olarak, görünümün adı aşağıdaki gibi denetleyici eyleminin adından çıkarılabilir:

public ActionResult Details(int Id)
{
     return View();
}

Bu denetleyici eylemi, adlı Detailsbir görünüm de döndürür. Ancak, görünümün adı eylem adından çıkarılır. Görünüm adını test etmek istiyorsanız, denetleyici eyleminden görünüm adını açıkça döndürmeniz gerekir.

Ctrl-R, A klavye bileşimini girerek veya Çözümde Tüm Testleri Çalıştır düğmesine tıklayarak Liste 2'de birim testini çalıştırabilirsiniz (bkz. Şekil 1). Test başarılı olursa, Şekil 2'de Test Sonuçları penceresini görürsünüz.

Çözümde Tüm Testleri Çalıştırma

Şekil 01: Tüm Testleri Çözümde Çalıştırma (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Başarı!

Şekil 02: Başarı! (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Denetleyici tarafından döndürülen Görünüm Verilerini Test Etme

MVC denetleyicisi adlı View Databir öğeyi kullanarak verileri bir görünüme geçirir. Örneğin, eylemi çağırırken ProductController Details() belirli bir ürünün ayrıntılarını görüntülemek istediğinizi düşünün. Bu durumda, bir Product sınıfın örneğini oluşturabilir (modelinizde tanımlanır) ve örneğini görünümünden View Datayararlanarak geçirebilirsinizDetails.

Liste 3'te değiştirilen ProductController , ürün döndüren güncelleştirilmiş Details() bir eylem içerir.

Listeleme 3 – ProductController.cs

using System;
using System.Web.Mvc;

namespace Store.Controllers
{
     public class ProductController : Controller
     {
          public ActionResult Index()
          {
               // Add action logic here
               throw new NotImplementedException();
          }

          public ActionResult Details(int Id)
          {
               var product = new Product(Id, "Laptop");
               return View("Details", product);
          }
     }
}

İlk olarak, Details() eylem bir dizüstü bilgisayarı temsil eden sınıfının yeni bir örneğini Product oluşturur. Ardından sınıfının örneği yöntemine Product ikinci parametre View() olarak geçirilir.

Beklenen verilerin görünüm verilerinde bulunup bulunmadığını test etmek için birim testleri yazabilirsiniz. Listeleme 4'teki birim testi, eylem yöntemini çağırdığınızda ProductController Details() dizüstü bilgisayarı temsil eden bir Ürünün döndürülip döndürülmeyeceğini test eder.

Listeleme 4 – ProductControllerTest.cs

using System.Web.Mvc;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Store.Controllers;

namespace StoreTests.Controllers
{
     [TestClass]
     public class ProductControllerTest
     {

          [TestMethod]
          public void TestDetailsViewData()
          {
               var controller = new ProductController();
               var result = controller.Details(2) as ViewResult;
               var product = (Product) result.ViewData.Model;
               Assert.AreEqual("Laptop", product.Name);
          }
     }
}

Listeleme 4'te TestDetailsView() yöntem, yöntemini çağırarak döndürülen Verileri Görüntüle'yi test ediyor Details() . ViewData yöntemi çağrılarak Details() döndürülen üzerinde ViewResult bir özellik olarak kullanıma sunulur. özelliği, ViewData.Model görünüme geçirilen ürünü içerir. Test basitçe Verileri Görüntüle'de bulunan ürünün Dizüstü bilgisayar adını içerdiğini doğrular.

Denetleyici tarafından döndürülen Eylem Sonucunu Test Etme

Daha karmaşık bir denetleyici eylemi, denetleyici eylemine geçirilen parametrelerin değerlerine bağlı olarak farklı türde eylem sonuçları döndürebilir. Denetleyici eylemi , RedirectToRouteResultveya JsonResultgibi ViewResultçeşitli türlerde eylem sonuçları döndürebilir.

Örneğin, Liste 5'teki değiştirilmiş Details() eylem, eyleme Details geçerli bir ürün kimliği geçirdiğinizde görünümü döndürür. Geçersiz bir ürün kimliği (değeri 1'den küçük bir kimlik) geçirirseniz eyleme Index() yönlendirilirsiniz.

Listeleme 5 – ProductController.cs

using System;
using System.Web.Mvc;
namespace Store.Controllers
{
     public class ProductController : Controller
     {
          public ActionResult Index()
          {
               // Add action logic here
               throw new NotImplementedException();
          }
          public ActionResult Details(int Id)
          {
               if (Id < 1)
                    return RedirectToAction("Index");
               var product = new Product(Id, "Laptop");
               return View("Details", product);

          }
     }
}

Liste 6'daki birim testiyle eylemin davranışını Details() test edebilirsiniz. Listeleme 6'daki birim testi, -1 değerine sahip bir kimlik yöntemine Index geçirildiğinde görünüme Details() yeniden yönlendirildiğinizi doğrular.

Listeleme 6 – ProductControllerTest.cs

using System.Web.Mvc;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Store.Controllers;
namespace StoreTests.Controllers
{
     [TestClass]
     public class ProductControllerTest
     {
          [TestMethod]
          public void TestDetailsRedirect()
          {
               var controller = new ProductController();
               var result = (RedirectToRouteResult) controller.Details(-1);
               Assert.AreEqual("Index", result.Values["action"]);

          }
     }
}

Bir denetleyici eyleminde RedirectToAction() yöntemini çağırdığınızda, denetleyici eylemi bir RedirectToRouteResultdöndürür. Test, kullanıcının adlı Indexbir denetleyici eylemine yönlendirilip yönlendirilmeyeceğini RedirectToRouteResult denetler.

Özet

Bu öğreticide, MVC denetleyici eylemleri için birim testleri oluşturmayı öğrendiniz. İlk olarak, doğru görünümün bir denetleyici eylemi tarafından döndürülp döndürülmediğini doğrulamayı öğrendinsiniz. Bir görünümün ViewResult.ViewName adını doğrulamak için özelliğini kullanmayı öğrendinsiniz.

Ardından içeriğini nasıl test ettiğinizi View Datainceledik. Denetleyici eylemi çağrıldıktan sonra doğru ürünün iade View Data edilip edilmediğini denetlemeyi öğrendiniz.

Son olarak, bir denetleyici eyleminden farklı türlerde eylem sonuçlarının döndürülip döndürülmeyeceğini nasıl test ettiğinizi ele aldık. Denetleyicinin bir veya RedirectToRouteResultdöndürerek döndürmediğini ViewResult test etme hakkında bilgi edindiyseniz.