Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
oleh Stephen Walther
Pelajari cara membuat pengujian unit untuk tindakan pengontrol. Dalam tutorial ini, Stephen Walther menunjukkan cara menguji apakah tindakan pengontrol mengembalikan tampilan tertentu, mengembalikan sekumpulan data tertentu, atau mengembalikan jenis hasil tindakan yang berbeda.
Tujuan dari tutorial ini adalah untuk menunjukkan bagaimana Anda dapat menulis pengujian unit untuk pengontrol di aplikasi MVC ASP.NET Anda. Kami membahas cara membangun tiga jenis pengujian unit yang berbeda. Anda mempelajari cara menguji tampilan yang dikembalikan oleh tindakan pengontrol, cara menguji Lihat Data yang dikembalikan oleh tindakan pengontrol, dan cara menguji apakah satu tindakan pengontrol mengarahkan Anda ke tindakan pengontrol kedua atau tidak.
Membuat Pengontrol di bawah Uji
Mari kita mulai dengan membuat pengontrol yang ingin kita uji. Pengontrol, bernama ProductController, terkandung dalam Daftar 1.
Daftar 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");
}
}
}
ProductController berisi dua metode tindakan bernama Index() dan Details(). Kedua metode tindakan mengembalikan tampilan. Perhatikan bahwa Details() tindakan menerima parameter bernama Id.
Menguji Tampilan yang dikembalikan oleh Pengontrol
Bayangkan bahwa kita ingin menguji apakah mengembalikan tampilan yang tepat atau tidak ProductController . Kami ingin memastikan bahwa ketika ProductController.Details() tindakan dipanggil, tampilan Detail dikembalikan. Kelas pengujian di Listing 2 berisi pengujian unit untuk menguji tampilan yang dikembalikan oleh ProductController.Details() tindakan.
Daftar 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);
}
}
}
Kelas di Listing 2 mencakup metode pengujian bernama TestDetailsView(). Metode ini berisi tiga baris kode. Baris pertama kode membuat instans baru kelas ProductController . Baris kedua kode memanggil metode tindakan pengontrol Details() . Terakhir, baris kode terakhir memeriksa apakah tampilan yang dikembalikan oleh Details() tindakan adalah tampilan Detail atau tidak.
Properti ViewResult.ViewName mewakili nama tampilan yang dikembalikan oleh pengontrol. Satu peringatan besar tentang menguji properti ini. Ada dua cara agar pengontrol dapat mengembalikan tampilan. Pengontrol dapat secara eksplisit mengembalikan tampilan seperti ini:
public ActionResult Details(int Id)
{
return View("Details");
}
Atau, nama tampilan dapat disimpulkan dari nama tindakan pengontrol seperti ini:
public ActionResult Details(int Id)
{
return View();
}
Tindakan pengontrol ini juga mengembalikan tampilan bernama Details. Namun, nama tampilan disimpulkan dari nama tindakan. Jika Anda ingin menguji nama tampilan, maka Anda harus secara eksplisit mengembalikan nama tampilan dari tindakan pengontrol.
Anda dapat menjalankan pengujian unit di Daftar 2 dengan memasukkan kombinasi keyboard Ctrl-R, A atau dengan mengklik tombol Jalankan Semua Pengujian di Solusi (lihat Gambar 1). Jika pengujian lolos, Anda akan melihat jendela Hasil Pengujian di Gambar 2.
Gambar 01: Jalankan Semua Pengujian dalam Solusi (Klik untuk melihat gambar ukuran penuh)
Gambar 02: Sukses! (Klik untuk melihat gambar ukuran penuh)
Menguji Data Tampilan yang dikembalikan oleh Pengontrol
Pengontrol MVC meneruskan data ke tampilan dengan menggunakan sesuatu yang disebut View Data. Misalnya, bayangkan Anda ingin menampilkan detail untuk produk tertentu saat Anda memanggil ProductController Details() tindakan. Dalam hal ini, Anda dapat membuat instans Product kelas (ditentukan dalam model Anda) dan meneruskan instans ke Details tampilan dengan memanfaatkan View Data.
Yang dimodifikasi ProductController dalam Daftar 3 menyertakan tindakan yang diperbarui Details() yang mengembalikan Produk.
Daftar 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);
}
}
}
Pertama, Details() tindakan membuat instans baru kelas Product yang mewakili komputer laptop. Selanjutnya, instans Product kelas diteruskan sebagai parameter kedua ke View() metode .
Anda dapat menulis pengujian unit untuk menguji apakah data yang diharapkan terkandung dalam data tampilan. Pengujian unit dalam Daftar 4 menguji apakah Produk yang mewakili komputer laptop dikembalikan atau tidak saat Anda memanggil ProductController Details() metode tindakan.
Daftar 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);
}
}
}
Di Daftar 4, TestDetailsView() metode menguji Data Tampilan yang dikembalikan dengan memanggil Details() metode .
ViewData diekspos sebagai properti pada yang ViewResult dikembalikan dengan memanggil Details() metode . Properti ViewData.Model berisi produk yang diteruskan ke tampilan. Pengujian ini hanya memverifikasi bahwa produk yang terkandung dalam View Data memiliki nama Laptop.
Menguji Hasil Tindakan yang dikembalikan oleh Pengontrol
Tindakan pengontrol yang lebih kompleks mungkin mengembalikan berbagai jenis hasil tindakan tergantung pada nilai parameter yang diteruskan ke tindakan pengontrol. Tindakan pengontrol dapat mengembalikan berbagai jenis hasil tindakan termasuk ViewResult, , RedirectToRouteResultatau JsonResult.
Misalnya, tindakan yang dimodifikasi Details() di Daftar 5 mengembalikan Details tampilan saat Anda meneruskan Id produk yang valid ke tindakan. Jika Anda meneruskan Id produk yang tidak valid -- Id dengan nilai kurang dari 1 -- maka Anda diarahkan ke Index() tindakan.
Daftar 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);
}
}
}
Anda dapat menguji perilaku Details() tindakan dengan pengujian unit di Daftar 6. Pengujian unit di Listing 6 memverifikasi bahwa Anda dialihkan ke Index tampilan saat Id dengan nilai -1 diteruskan ke Details() metode .
Daftar 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"]);
}
}
}
Ketika Anda memanggil RedirectToAction() metode dalam tindakan pengontrol, tindakan pengontrol mengembalikan RedirectToRouteResult. Pengujian memeriksa apakah RedirectToRouteResult akan mengalihkan pengguna ke tindakan pengontrol bernama Index.
Ringkasan
Dalam tutorial ini, Anda mempelajari cara membangun pengujian unit untuk tindakan pengontrol MVC. Pertama, Anda mempelajari cara memverifikasi apakah tampilan yang tepat dikembalikan oleh tindakan pengontrol. Anda mempelajari cara menggunakan ViewResult.ViewName properti untuk memverifikasi nama tampilan.
Selanjutnya, kami memeriksa bagaimana Anda dapat menguji konten View Data. Anda mempelajari cara memeriksa apakah produk yang tepat dikembalikan View Data setelah memanggil tindakan pengontrol.
Terakhir, kami membahas bagaimana Anda dapat menguji apakah berbagai jenis hasil tindakan dikembalikan dari tindakan pengontrol. Anda mempelajari cara menguji apakah pengontrol mengembalikan ViewResult atau RedirectToRouteResult.