ASP.NET MVC Tip #3 – Provide Explicit View Names khi Unit Testing
Trong thủ thuật này, Stephen Walther giải thích làm thế nào bạn có thể unit test cho dù một hành động điều khiển trả về một view cụ thể. Framework ASP.NET MVC được thiết kế để dễ test. Bạn có thể dễ dàng test 1 controller action MVC để xác định liệu các hành động trả về kết quả mà bạn mong đợi. ...
Trong thủ thuật này, Stephen Walther giải thích làm thế nào bạn có thể unit test cho dù một hành động điều khiển trả về một view cụ thể.
Framework ASP.NET MVC được thiết kế để dễ test. Bạn có thể dễ dàng test 1 controller action MVC để xác định liệu các hành động trả về kết quả mà bạn mong đợi. Trong thủ thuật này, tôi chỉ cho bạn làm thế nào để kiểm tra xem một hành động điều khiển trả về một view cụ thể.
Hãy xem xét các điều khiển MVC, tên HomeController, trong List 1. Bộ điều khiển này có một hành động có tên là Index (). Hành động Index() trả về một view. Tuy nhiên, tên của view không được cung cấp. Thay vào đó, tên của view được suy ra từ tên của các hành động điều khiển. Vì vậy, khi bạn gọi hành động Index (), một view mang tên Index được trả về.
HomeController chứa một hành động thứ hai có tên Index2 (). hành động thứ hai này cũng trả về một view. Tuy nhiên, trong hành động thứ hai, tên của view là minh bạch. Tên của view được truyền cho phương thức View (). hành động điều khiển thứ hai này cũng có chức năng tương tự như các hành động điều khiển đầu tiên. Tuy nhiên, trong trường hợp của hành động điều khiển đầu tiên tên view là được suy ra và trong trường hợp của các hành động điều khiển thứ hai được xem là minh bạch.
Listing 1 - HomeController.vb (VB)
1: Public Class HomeController 2: Inherits System.Web.Mvc.Controller 3: 4: Function Index() As ActionResult 5: Return View() ' view name inferred 6: End Function 7: 8: Function Index2() As ActionResult 9: Return View("Index") ' view name explicit 10: End Function 11: 12: End Class
Listing 1 - HomeController.cs (C#)
1: using System; 2: using System.Collections.Generic; 3: using System.Linq; 4: using System.Web; 5: using System.Web.Mvc; 6: 7: namespace Tip3.Controllers 8: { 9: public class HomeController : Controller 10: { 11: public ActionResult Index() 12: { 13: return View(); // view name inferred 14: } 15: 16: public ActionResult Index2() 17: { 18: return View("Index"); // view name explicit 19: } 20: 21: 22: } 23: }
Nếu bạn có kế hoạch để tạo ra unit test cho ứng dụng ASP.NET MVC của bạn, sau đó bạn nên rõ ràng về tên của view. Nếu không, bạn sẽ không thể để kiểm tra xem view đúng được trả lại trong các unit test của bạn.
Các lớp kiểm tra trong Liệt kê 2 chứa hai phương thức thử. Phương thức đầu tiên HomeController’s Index() và phương pháp thứ hai kiểm tra các hành động HomeController của Index2 (). Thử nghiệm đầu tiên luôn luôn thất bại và thử nghiệm thứ hai luôn luôn thành công (xem Hình 1).
Listing 2 - HomeControllerTest.vb (VB)
1: Imports System 2: Imports System.Collections.Generic 3: Imports System.Text 4: Imports System.Web.Mvc 5: Imports Microsoft.VisualStudio.TestTools.UnitTesting 6: Imports Tip3 7: 8: <TestClass()> Public Class HomeControllerTest 9: 10: 11: <TestMethod()> _ 12: Public Sub Index() 13: ' Arrange 14: Dim controller As New HomeController() 15: 16: ' Act 17: Dim result As ViewResult = controller.Index() 18: 19: ' Assert 20: Assert.AreEqual("Index", result.ViewName) 21: End Sub 22: 23: <TestMethod()> _ 24: Public Sub Index2() 25: ' Arrange 26: Dim controller As New HomeController() 27: 28: ' Act 29: Dim result As ViewResult = controller.Index2() 30: 31: ' Assert 32: Assert.AreEqual("Index", result.ViewName) 33: End Sub 34: 35: 36: 37: End Class
Listing 2 - HomeControllerTest.cs (C#)
1: using System; 2: using System.Collections.Generic; 3: using System.Linq; 4: using System.Text; 5: using System.Web.Mvc; 6: using Microsoft.VisualStudio.TestTools.UnitTesting; 7: using Tip3; 8: using Tip3.Controllers; 9: 10: namespace Tip3Tests.Controllers 11: { 12: /// <summary> 13: /// Summary description for HomeControllerTest 14: /// </summary> 15: [TestClass] 16: public class HomeControllerTest 17: { 18: [TestMethod] 19: public void Index() 20: { 21: // Arrange 22: HomeController controller = new HomeController(); 23: 24: // Act 25: ViewResult result = controller.Index() as ViewResult; 26: 27: // Assert 28: Assert.AreEqual("Index", result.ViewName); 29: } 30: 31: 32: [TestMethod] 33: public void Index2() 34: { 35: // Arrange 36: HomeController controller = new HomeController(); 37: 38: // Act 39: ViewResult result = controller.Index2() as ViewResult; 40: 41: // Assert 42: Assert.AreEqual("Index", result.ViewName); 43: } 44: 45: 46: } 47: }
Hình 1 - Kết quả Unit Test
Một unit test không thể suy ra một tên view. Tôi đề nghị là bạn nên luôn luôn rõ ràng về tên của view nếu bạn có kế hoạch thử nghiệm ứng dụng của bạn . [Download the Code](https://aspblogs.blob.core.windows.net/media/stephenwalther/Downloads/Tip3/Tip3.zip)
Nguồn: https://weblogs.asp.net/stephenwalther/asp-net-mvc-tip-3-provide-explicit-view-names-when-unit-testing