原文地址:
摘要:在这个Tip中,Stephen Walther解释了当控制器action需要返回一个特定的视图时,应该如何进行单元测试。他建议你如果打算建立单元测试的话,还是要明确地指出视图的名称。
ASP.NET MVC框架是一个高度可测试的框架。你可以很方便地测试MVC控制器Action,确定它是否能够返回你所期望的结果。在这个Tip中,我会向你展示如何测试一个会返回特定视图的控制器action。
考虑清单1中名为HomeController的MVC控制器。该控制器包含一个名为Index()的action。Index() action返回一个视图。然而,这里并没有提供视图的名字。视图的名字是通过控制器action的名字推断出来的。因此,当你到用Index() action时,会返回名为Index的视图。
HomeController还包含另外一个名为Index2()的action。这个action也返回一个视图。然而,这个action明确地指出了视图的名字。视图的名字被传递到View()方法中。该控制器action和第一个控制器action做的事情是相同的。然而,第一个控制器action的视图名字是推断出来的,而第二个控制器action的视图名字是明确指定的。
清单1 - HomeController.cs
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 : Controller10 { 11 public ActionResult Index()12 { 13 return View(); // view name inferred14 }15 16 public ActionResult Index2()17 { 18 return View("Index"); // view name explicit19 }20 21 22 }23} 如果你计划为ASP.NET MVC应用程序创建单元测试,则你必需明确指定视图的名字。否则,即便返回了正确的视图,也无法通过单元测试。
清单2的测试类中包含了两个测试方法。第一个方法测试了HomeController的Index() action,第二个方法测试了Index2()。第一个测试总是失败,而第二个测试则能成功(参见图1)。
清单2 - HomeControllerTest.cs
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 HomeControllerTest14 /// </summary>15 [TestClass]16 public class HomeControllerTest17 { 18 [TestMethod]19 public void Index()20 { 21 // Arrange22 HomeController controller = new HomeController();23 24 // Act25 ViewResult result = controller.Index() as ViewResult;26 27 // Assert28 Assert.AreEqual("Index", result.ViewName);29 }30 31 32 [TestMethod]33 public void Index2()34 { 35 // Arrange36 HomeController controller = new HomeController();37 38 // Act39 ViewResult result = controller.Index2() as ViewResult;40 41 // Assert42 Assert.AreEqual("Index", result.ViewName);43 }44 45 46 }47} 图1 - 单元测试结果
单元测试无法推断视图名字。我的建议是,如果打算进行单元测试,应该总是明确指定视图的名字。
此处下载源代码:
。 ------ 广告:欢迎光临[.NET正则表达式库] 。