您的位置:首页 > 其它

演练:在 Visual Studio 中创建一个带单元测试的基本 MVC2 项目

2013-03-20 16:53 495 查看
http://msdn.microsoft.com/zh-cn/library/dd410597(v=vs.100).aspx

 

在本演练中,您将创建并运行示例 MVC 应用程序。然后将通过添加控制器和视图来自定义该应用程序。

此外,本演练还演示如何使用测试驱动的开发 (TDD)。 在本演练中,您将创建一个包含 MVC 应用程序单元测试的项目。

Download(下载)主题附带含源代码的 Visual Studio 项目。

 

系统必备

Microsoft Visual Studio 2008 Service Pack 1 或更高版本。
ASP.NET MVC 2 框架。如果您已安装 Visual Studio 2010,则在您的计算机上已安装了 ASP.NET MVC 2。若要下载该框架的最新版本,请参见 ASP.NET MVC download(ASP.NET MVC 下载)页。
 

创建新的 MVC 项目

在“文件”菜单上,单击“新建项目”。

将显示“新建项目”对话框。



在右上角中,确保选择“.NET Framework 3.5”。

在“项目类型”下,展开“Visual Basic”或“Visual C#”,再单击“网站”。

在“Visual Studio 已安装的模板”下面,选择“ASP.NET MVC 2 Web 应用程序”。

在“名称”框中输入“MvcBasicWalkthrough”。

在“位置”框中,输入项目文件夹的名称。

如果希望解决方案的名称不同于项目名称,请在“解决方案名称”框中输入名称。

选择“创建解决方案的目录”。

单击“确定”。

随即显示“创建单元测试项目”对话框。




注意

如果使用的是 Visual Studio 的标准版或学习版,则不会显示“创建单元测试项目”对话框。而是会生成不含测试项目的新 MVC 应用程序项目。

选择“是,创建单元测试项目”。

默认情况下,该测试项目的名称为添加了“Tests”的应用程序项目名称。不过,您可以更改该测试项目的名称。默认情况下,该测试项目将使用 Visual Studio 单元测试框架。有关如何使用第三方测试框架的信息,请参见如何:在 Visual Studio 中添加自定义的 ASP.NET MVC 测试框架

单击“确定”。

此时将生成新的 MVC 应用程序项目和测试项目。

 

检查MVC项目

 

下图演示新创建的 MVC 解决方案的文件夹结构。





MVC 项目的文件夹结构不同于 ASP.NET 网站项目的文件夹结构。MVC 项目包含以下文件夹:

Content,用于存储内容支持文件。此文件夹包含应用程序的级联样式表(.css 文件)。
Controllers,用于存储控制器文件。此文件夹包含应用程序的名为 AccountController 和 HomeController 的示例控制器。 AccountController 类包含应用程序登录逻辑。 HomeController 类包含应用程序启动时默认情况下调用的逻辑。
Models,用于存储数据模型文件,如 LINQ-to-SQL .dbml 文件或数据实体文件。
Scripts,用于存储脚本文件,如支持 ASP.NET AJAX 和 jQuery 的脚本文件。
Views,用于存储视图页文件。此文件夹包含以下三个子文件夹:Account、Home 和 Shared。Account 文件夹包含用作 UI 的视图,该 UI 用于登录和更改密码。Home 文件夹包含“Index”视图(应用程序的默认起始页)和“About”页视图。Shared 文件夹包含应用程序的母版页视图。
如果使用的是 Visual Studio 标准版或学习版以外的版本,则也会生成测试项目。该测试项目具有包含 HomeControllerTest 类的 Controllers 文件夹。此类具有每个HomeController 操作方法(Index 和 About)的单元测试。

新生成的 MVC 项目是一个可以编译的完整应用程序,无需更改就可以运行。下图演示了在浏览器中运行应用程序时应用程序的外观。





单元测试项目也准备就绪,可以编译和运行。对于本演练,您将添加一个具有操作方法和视图的控制器,并且将为该操作方法添加单元测试。

 

 

添加控制器

您现在将添加一个控制器,该控制器包含用于从 Microsoft Virtual Earth Web 服务下载城市地图的逻辑。

向 MVC 项目添加控制器

1. 在解决方案资源管理器中,右击“Controllers”文件夹,再单击添加,然后单击控制器

随即显示添加控制器对话框。





2. 在名称框中键入 MapsController

ASP.NET MVC 框架要求控制器名称以“Controller”结尾,如 HomeController、GameController 或 MapsController。

3. 清除创建更新详细信息方案添加操作方法复选框。

4. 单击添加

Visual Studio 会将 MapsController 类添加到项目中,并在编辑器中打开该类。

 

创建操作方法存根

若要将测试驱动的开发 (TDD) 技术应用于此项目,在编写操作方法本身之前,您应该为其编写单元测试。但是,如果希望编译单元测试,则必须具有计划的操作方法的存根,在本演练中,此存根为 ViewMaps。

创建操作方法存根

1. 打开或切换到 MapsController 类。

2. 用以下代码替换 Index 操作方法,以便创建 ViewMaps 操作方法存根。

VB

Function ViewMaps()

' Add action logic here

Throw New NotImplementedException()

End Function

C#

public ActionResult ViewMaps()

{

// Add action logic here

throw new NotImplementedException();

}

 

 

为操作方法添加单元测试

接下来,您将向测试项目添加控制器测试类。在此类中,您将为 ViewMaps 操作方法添加单元测试。单元测试将会失败,因为 ViewMaps 操作方法存根引发异常。在本演练后面部分中完成操作方法时,将会通过测试。

为操作方法添加单元测试

1. 在测试项目中,右击“Controllers”文件夹,单击添加,然后单击

2. 在名称文本框中,键入 MapsControllerTest

3. 单击添加

Visual Studio 会将 MapsControllerTest 类添加到测试项目中。

4. 打开 MapsControllerTest 类并输入以下代码:

C#

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using Microsoft.VisualStudio.TestTools.UnitTesting;

using System.Web.Mvc;

using MvcBasicWalkthrough;

using MvcBasicWalkthrough.Controllers;

namespace MvcBasicWalkthrough.Tests.Controllers

{

[TestClass]

public class MapsControllerTest

{

[TestMethod]

public void ViewMaps()

{

// Arrange

MapsController controller = new MapsController();

// Act

ViewResult result = controller.ViewMaps() as ViewResult;

// Assert

Assert.IsNotNull(result);

}

}

}

此代码为稍后将完成的操作方法定义单元测试。

5. 在解决方案资源管理器中,选择该测试项目,然后按 Ctrl+F5 运行单元测试。

测试将会失败,因为 ViewMaps 操作方法当前引发异常。

 

添加视图

接下来,您将添加 Maps 视图。为了使视图井井有条,您将首先在 Views 文件夹下面添加 Maps 文件夹。

向 MVC 项目添加页面内容视图

1. 打开 MapsController 类,在 ViewMaps 操作方法内右击,然后单击添加视图

随即显示添加视图对话框。





2. 在视图名称框中输入 ViewMaps

3. 清除创建分部视图(.ascx)”创建强类型视图复选框。

4. 选中选择母版页复选框,并将母版页设置为 ~/Views/Shared/Site.Master

5. 将“ContentPlaceHolder ID”设置为“MainContent”。

6. 单击添加

该新视图将添加到项目内的 Maps 文件夹中。

 

向视图添加内容

接下来,您将向新视图添加内容。

向视图添加内容

1. 打开 ViewMaps.aspx 并在 Content 元素内添加以下内容:

<h2>My City Maps</h2>

Select map:

<select onclick="GetMap(value);">

<option value="Seattle">Seattle, WA</option>

<option value="LasVegas">Las Vegas, NV</option>

<option value="SaltLake">Salt Lake City, UT</option>

<option value="Dallas">Dallas, TX</option>

<option value="Chicago">Chicago, IL</option>

<option value="NewYork">New York, NY</option>

<option value="Rio">Rio de Janeiro, Brazil</option>

<option value="Paris">Paris, France</option>

<option value="Naples">Naples, Italy</option>

<option value="Keta">Keta, Ghana</option>

<option value="Beijing">Beijing, China</option>

<option value="Sydney">Sydney, Australia</option>

</select>

<br />

<br />

<div id='earthMap' style="position:relative; width:400px; height:400px;">

</div>

<script charset="UTF-8" type="text/javascript"

src="http://dev.virtualearth.net/mapcontrol/mapcontrol.ashx?v=6.2&mkt=en-us">

</script>

<script type="text/javascript">

var map = null;

var mapID = '';

function GetMap(mapID)

{

switch (mapID)

{

case 'Seattle':

map = new VEMap('earthMap');

map.LoadMap(new VELatLong(47.6, -122.33), 10 ,'i', true);

break;

case 'LasVegas':

map = new VEMap('earthMap');

map.LoadMap(new VELatLong(36.17, -115.14), 10 ,'i' ,true);

break;

case 'SaltLake':

map = new VEMap('earthMap');

map.LoadMap(new VELatLong(40.75, -111.89), 10 ,'i' ,true);

break;

case 'Dallas':

map = new VEMap('earthMap');

map.LoadMap(new VELatLong(32.78, -96.8), 10 ,'i' ,true);

break;

case 'Chicago':

map = new VEMap('earthMap');

map.LoadMap(new VELatLong(41.88, -87.62), 10 ,'i' ,true);

break;

case 'NewYork':

map = new VEMap('earthMap');

map.LoadMap(new VELatLong(40.7, -74), 10 ,'i' ,true);

break;

case 'Rio':

map = new VEMap('earthMap');

map.LoadMap(new VELatLong(-22.91, -43.18), 10 ,'i' ,true);

break;

case 'Paris':

map = new VEMap('earthMap');

map.LoadMap(new VELatLong(48.87, 2.33), 10 ,'i' ,true);

break;

case 'Naples':

map = new VEMap('earthMap');

map.LoadMap(new VELatLong(40.83, 14.25), 10 ,'i' ,true);

break;

case 'Keta':

map = new VEMap('earthMap');

map.LoadMap(new VELatLong(5.92, 0.983), 10 ,'i' ,true);

break;

case 'Beijing':

map = new VEMap('earthMap');

map.LoadMap(new VELatLong(39.91, 116.39), 10 ,'i' ,true);

break;

case 'Sydney':

map = new VEMap('earthMap');

map.LoadMap(new VELatLong(-33.86, 151.21), 10 ,'i' ,true);

}

}

</script>

此标记定义用于选择地图的下拉列表,以及用于从 Microsoft Virtual Earth Web 服务中检索选定的地图的 JavaScript 逻辑。

2. 保存并关闭文件。

 

向母版页菜单添加选项卡

您现在将向母版页菜单添加一个调用 ViewMaps 操作方法的项。

向母版页菜单添加选项卡

1. 在 Shared 文件夹中,打开 Site.master 文件,找到 ID 为“menucontainer”的 div 元素中未排序的列表(ul 元素)。

2. 向列表中“Index”“About Us”选项卡之间添加以下代码:

<li><%= Html.ActionLink("My City Maps", "ViewMaps", "Maps")%></li>

ActionLink 方法是链接到操作方法的帮助器方法。它采用以下参数:链接文本、操作方法的名称以及控制器的名称。

3. 保存并关闭文件。

 

测试 MVC 应用程序

您现在可以测试应用程序。

1. 在测试菜单上,单击运行,然后单击解决方案中的所有测试

结果将显示在测试结果窗口中。这次通过了测试。

2. 在解决方案资源管理器中,选择演练项目,然后按 Ctrl+F5 运行应用程序。

此时将显示 Index.aspx 页,它包括母版页中定义的选项卡。

3. 单击“My City Maps”选项卡。

此时将显示“My City Maps”页。选择任意地图以进行查看。





 

 

后续步骤

通过本演练,您可以预先了解如何在 ASP.NET MVC 中创建 MVC 应用程序以及使用单元测试。您可能希望从中了解有关 ASP.NET MVC 框架的更多信息。下面列出了建议的主题,以供进一步了解。

有关 MVC 控制器的更多信息,请参见 ASP.NET MVC 应用程序中的控制器和操作方法
有关 MVC 视图的更多信息,请参见 ASP.NET MVC 应用程序中的视图和 UI 呈现
有关 MVC 模型的更多信息,请参见 ASP.NET MVC 中的模型和验证
有关 URL 路由的更多信息,请参见 ASP.NET 路由
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: