12/08/2018, 15:12

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 alt

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

0