11-3URLTestDemo实例操作完成URL单元测试

11-3URLTestDemo

1、File -> New -> Project

在左边模板中选择Visual C#里的Web,对应到的项目类型选择ASP.NET MVC3 Web
Application,并给项目取名字为11-3URLTestDemo,默认的解决方案名自动为相应的11-3URLTestDemo。

2、在解决方案管理器中,鼠标右击解决方案名字Solution’ 11-3URLTestDemo’,选择Add -> New
Project,如下图。

打开“Add New Project”对话框后,在左边的模板选择Visual C#里的Test,对应的项目类型选择Test
Project,并取名字为URLTestDemo.UnitTests,如下图。

创建好项目后,可以将不用的Class1.cs文件和URLTestDemo.UnitTests项目中的UnitTest1.cs文件删除掉。

3、给URLTestDemo.UnitTests项目添加Moq程序包和对项目11-3URLTestDemo的依赖。

在URLTestDemo.UnitTests项目名上右击鼠标,选择Manage NuGet
Packages…,在打开的对话框中在线搜索Moq,并安装。再次在URLTestDemo.UnitTests项目名上右击鼠标,选择Add
Reference,在打开的对话框中选择对项目11-3URLTestDemo的依赖。

4、本例是为了对URL做单元测试,在11-3URLTestDemo项目中,打开Global.asax.cs文件,将RegisterRoutes函数修改如下:

public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute("MyRoute", "{controller}/{action}");

}

然后再在RegisterRoutes函数上点鼠标右键,选择Create Unit
Tests,创建单元测试的文件,这里就会在项目URLTestDemo.UnitTests中产生一个名字为MvcApplicationTest.cs的文件,打开该文件,将MvcApplicationTest类中的原有内容删除,修改如下:


namespace URLTestDemo.UnitTests
{
[TestClass()]
public class MvcApplicationTest
{
private HttpContextBase CreateHttpContext(string targetUrl=null,
string httpMethod = "GET")
{
Mock<HttpRequestBase> mockRequest = new Mock<HttpRequestBase>();
mockRequest.Setup(m => m.AppRelativeCurrentExecutionFilePath).Returns(targetUrl);
mockRequest.Setup(m => m.HttpMethod).Returns(httpMethod);

Mock<HttpResponseBase> mockResponse = new Mock<HttpResponseBase>();
mockResponse.Setup(m => m.ApplyAppPathModifier(
It.IsAny<string>())).Returns<string>(s => s);

Mock<HttpContextBase> mockContext = new Mock<HttpContextBase>();
mockContext.Setup(m => m.Request).Returns(mockRequest.Object);
mockContext.Setup(m => m.Response).Returns(mockResponse.Object);

return mockContext.Object;
}

private void TestRouteMatch(string url, string controller,
string action, object routeProperties = null,
string httpMethod = "GET")
{
//布置
RouteCollection routes = new RouteCollection();
MvcApplication.RegisterRoutes(routes);

//动作
RouteData result = routes.GetRouteData(CreateHttpContext(url, httpMethod));

//断言
Assert.IsNotNull(result);
Assert.IsTrue(TestIncomingRouteResult(result, controller, action, routeProperties));
}

private bool TestIncomingRouteResult(RouteData routeResult,
string controller, string action, object propertySet = null)
{
Func<object, object, bool> valCompare = (v1, v2) =>
{
return StringComparer.InvariantCultureIgnoreCase.Compare(v1, v2) == 0;
};
bool result = valCompare(routeResult.Values["controller"], controller)
&& valCompare(routeResult.Values["action"], action);

if (propertySet != null)
{
PropertyInfo[] propInfo = propertySet.GetType().GetProperties();
foreach (PropertyInfo pi in propInfo)
{
if (!(routeResult.Values.ContainsKey(pi.Name) &&
valCompare(routeResult.Values[pi.Name], pi.GetValue(propertySet, null))))
{
result = false;
break;
}
}
}
return result;
}

private void TestRouteFail(string url)
{
//布置
RouteCollection routes = new RouteCollection();
MvcApplication.RegisterRoutes(routes);

//动作
RouteData result = routes.GetRouteData(CreateHttpContext(url));

//断言
Assert.IsTrue(result == null || result.Route == null);
}

[TestMethod]
public void TestIncomingRoutes()
{
TestRouteMatch("~/Admin/Index", "Admin", "Index");
TestRouteMatch("~/One/Two", "One", "Two");

TestRouteFail("~/Admin/Index/Segment");
TestRouteFail("~/Admin");
}
}
}

5、接下来,在菜单上选择Test -> Run -> All Tests in Solution,执行单元测试。

时间: 2024-08-29 20:10:36

11-3URLTestDemo实例操作完成URL单元测试的相关文章

QSqlQueryModel的实例操作

QSqlQueryModel类为SQL的结果集提供了一个只读的数据模型,下面我们先利用这个类进行一个最简单的操作. 我们新建Qt4 Gui Application工程,我这里工程名为queryModel ,然后选中QtSql模块,Base class选QWidget.工程建好后,添加C++ Header File ,命名为database.h,更改其内容如下: 1.           #ifndef DATABASE_H   2.             3.           #defin

ANTLR和StringTemplate实例:自动生成单元测试类

ANTLR和StringTemplate实例:自动生成单元测试类 1. ANTLR语法 要想自动生成单元测试,首先第一步就是分析被测试类.这里以Java代码为例,用ANTLR对Java代码进行分析.要想靠自己完全手写出一门语言的ANTLR语法文件的复杂程度难以想象,很贴心的是在ANTLR的GitHub网站上列出了很多常见语言的语法文件,例如Java,Sqlite和MySQL的SQL语法等. 有了.g4语法文件,按照Antlr v4入门教程和实例中的步骤,就能自动生成出解析器的代码,这里就不再详述

[Sqlite]--&gt;嵌入式数据库事务理解以及实例操作

SQLite 事务(Transaction) 事务(Transaction)是一个对数据库执行工作单元.事务(Transaction)是以逻辑顺序完成的工作单位或序列,可以是由用户手动操作完成,也可以是由某种数据库程序自动完成. 事务(Transaction)是指一个或多个更改数据库的扩展.例如,如果您正在创建一个记录或者更新一个记录或者从表中删除一个记录,那么您正在该表上执行事务.重要的是要控制事务以确保数据的完整性和处理数据库错误. 实际上,您可以把许多的 SQLite 查询联合成一组,把所

JavaScript学习11 数组排序实例

JavaScript学习11 数组排序实例 数组声明 关于数组对象的声明,以前说过:http://www.cnblogs.com/mengdd/p/3680649.html 数组声明的一种方式: var array = new Array(); array.push(1); array.push(2); array.push(3); alert(array.length) 数组声明的第二种方式,并排序: var array = [1, 3, 25]; array.sort(); //对数组排序,

Linux DNS视图脑裂的实例操作(四)

DNS视图 bind view:  视图,脑裂(split-brain)双线接入.如:电信和联通双线接入  根据客户端来源的不同,将同一个名称解析至不同的地址: 案例:我们接下来配置内外网双向解析DNS服务器:同一个名称解析,分配给不同的IP地址 实验条件:我们这里为了方便理解操作直接在服务器上添加了两块网卡,(实际操作中只要能和DNS服务器能通信即可)实际操作如下!! 我们是讲解的方法:方便操作设置以下地址(你懂得.)   实例: 主配置:主配置文件主要设置,把根域复制到辅配置文件中,看配置文

iPhone应用开发之自动登陆实例操作

iPhone应用开发之自动登陆实例操作是本文要介绍的内容,主要内容是实现自动登录的实例,不多说,我们来看详细内容. App 里有一个有一个UITabBarController,在进入UITabBarController之前要验证用户是否已经登陆,如果没有登陆就弹出一个对话框,让用户输入登陆信息. 实现方式 1.在appDelegate.h里声明一个变量,用来绑定UITableController: UITabBarController *tabbarController; 2.在appDeleg

每天一个JavaScript实例-操作元素定位元素

<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>每天一个JavaScript实例-操作元素定位元素</title> <style> div#a{ width:500px; } div{ border:1px solid

基于spark1.4.1的sparkR的实例操作

[Author]: kwu 基于spark1.4.1的sparkR的实例操作,sparkR的操作基本语法与R一致,其中添加了rJava.rhdfs.SparkR的依赖库的支持. 1.集群启动SparkR 输入 bdcmagicR 关于启动脚本的封装参看 : http://blog.csdn.net/bdchome/article/details/48092499 2.加载依赖库 library("rJava") library("rhdfs") library(&q

Flashback Drop实例操作

1.Flashback DropFlashback Drop 是从Oracle 10g 开始出现的,用于恢复用户误删除的对象(包括表,索引等), 这个技术依赖于Tablespace Recycle Bin(表空间回收站) ,这个功能和windows的回收站非常类似.Flashback 不支持sys用户. system表空间下的对象,也不能从回收站里拿到.故使用SYS 或者SYSTEM用户登陆时, show recyclebin 为空.Flashback Drop 是基于Tablespace Re