Tip#3-单元测试时请直接给出View的名字
该篇文章是Encosia博客中的文章,个人觉得不错就翻译了一下。但由于个人英语水平有限,还望各位海量。如果想看原文,请点击ASP.NET MVC Tip #3 – Provide Explicit View Names when Unit Testing 查看原文。
这个篇条目中,Stephen Walther向你讲述怎样对控制器操作返回特定的View进行单元测试。他建议当你要创建单元测试时明确View的名称。
Asp.net MVC框架被设计的非常可测试性。你能非常容易的测试一个MVC控制器操作确定是否这个操作返回了正确的结果。这个条目中,我会给你展示怎样测试一个控制器操作返回了特定的View。
在列表1中,考虑名为HomeControlller的MVC控制器。这个控制器中包含一个名为Index()的操作。这个Index()操作返回一个View。但是这个View的名字没有被提供。这个View的名字是从控制器动作的名称中推导出的。因此当我们调用Index()操作时,一个名为Index的View被返回。
HomeControlller包含第二个名为Index2()的操作。这个操作也同样返回一个View。但是在第二个操作中,View的名字被明确的定义。这个View的名字传递给View()方法。第二个控制器操作实现第一个控制器同样的功能。但是,就名字而言第一个view的名字是被推导出的而第二个view的名字是直接给出的。
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 public ActionResult Index2()
16 {
17 return View("Index"); // view name explicit
18 }
19 }
20 }
如果你要为你的Asp.net MVC程序创建单元测试,你应当直接的给出你的View的名称。否则,你不会从你的单元测试中返回正确的结果。
列表2中的测试类有两个测试方法。第一个测试方法测试HomeControlller的Index()操作,第二个方法测试HomeControlller的Index2()操作。第一个测试失败第二个测试成功。
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 [TestMethod]
31 public void Index2()
32 {
33 // Arrange
34 HomeController controller = new HomeController();
35
36 // Act
37 ViewResult result = controller.Index2() as ViewResult;
38
39 // Assert
40 Assert.AreEqual("Index", result.ViewName);
41 }
42 }
43 }
单元测试不能推断一个View的名称。我的建议是如果你计划要测试你的程序你应当直接的给我view的名字。
下载源代码