mvc+webapi 单元测试
1.前言
现在这个项目已经有阶段性的模块完成了,所以就想着对这些模块进行单元测试,以保证项目的代码的质量。首先虽然标题是mvc+webapi实质上我只是对mvc进行的测试。用的时候vs的unit test generator(2015自带).至于它版本的安装和介绍在这不做详细介绍。还有其实我也任务单元测试就是个鸡肋。第一它浪费时间,第二他也不能完全保证我的代码完全没有问题,第三我的测试并不能算到的绩效当中去。所以我把它当做对我一个阶段代码的梳理来对待。
2.单元测试建立
2.1新建单元测试项目
此项目我是把它当作模块插件来处理。
2.2.添加单元测试类
[TestClass]
public class mtnfim
{
//实例化测试mvc Controller
mgtController mtn_fim = new mgtController();
[TestMethod]
public void IndexTest()
{
//调用类中方法
var ret = mtn_fim.Index() as ViewResult;
int errcode = testresult.action_result(ret).errcode;
Assert.AreEqual(, errcode);
}
}
2.3.代码解释如下:
2.3.1Assert类的使用
Assert.AreEqual() 测试指定的值是否相等,如果相等,则测试通过;
AreSame() 用于验证指定的两个对象变量是指向相同的对象,否则认为是错误
AreNotSame() 用于验证指定的两个对象变量是指向不同的对象,否则认为是错误
Assert.IsTrue() 测试指定的条件是否为True,如果为True,则测试通过;
Assert.IsFalse() 测试指定的条件是否为False,如果为False,则测试通过;
Assert.IsNull() 测试指定的对象是否为空引用,如果为空,则测试通过;
Assert.IsNotNull() 测试指定的对象是否为非空,如果不为空,则测试通过;
2.3.2.返回类型的处理
我项目当中mvc Controller的返回类型有两个JsonResult。ActionrResult.两种,所以针对于assert类的使用显然我要对mvc的返回的对象进行处理。
jsonresult的处理方式:
通过nugt下载ExposedObject把 对象转为dynami然后对其对象进行操作。代码如下。
var jsonret = mtn_fim.add_feeitem("测试", "cs");
var ret = Exposed.From(jsonret.Data);
int errcode = ret.errcode;
Assert.AreEqual(, errcode);
ActionrResult的处理:
相对与jsonresult直接操作返回对象即可,对此我写了一个方法。
public static class testresult
{
public static result<object> action_result(ViewResult ret)
{
return ((wx.web.result<object>)(((System.Web.Mvc.ViewResultBase)((ret))).Model));
}
public static result apicitroller_result(System.Web.Http.IHttpActionResult action)
{
var rs = ((System.Web.Http.Results.OkNegotiatedContentResult<wx.web.result>)
(action)).Content;
return rs;
}
}
使用如下:
var ret = mtn_fim.Index() as ViewResult;
int errcode = testresult.action_result(ret).errcode;
Assert.AreEqual(, errcode);
3.实现之外的事:
3.1.数据库初始化
以上已经初步实现了单元测试的基本实现,但是考虑到单元测试重复测试,我用ef code first动态的数据库创建,和需要测试的数据。
public void Initialize(FeeDbContext context)
{
List<organization> orgs = new List<organization>() {
, name="新中新集团1", state=true,reg_time=DateTime.Now},
, name="山东大学", state=true,reg_time=DateTime.Now},
, name="浙江大学", state=true,reg_time=DateTime.Now},
, name="同济大学", state=true,reg_time=DateTime.Now}
};
List<fee_item> fim = new List<fee_item>() {
,appid=,reg_time=DateTime.Now},
,appid=,reg_time=DateTime.Now},
,appid=,reg_time=DateTime.Now},
,appid=,reg_time=DateTime.Now},
,appid=,reg_time=DateTime.Now},
,appid=,reg_time=DateTime.Now}
};
List<school_power> con_power = new List<school_power>() {
,power_code=",reg_time=DateTime.Now},
,power_code=",reg_time=DateTime.Now}
};
//depts.ForEach(o => context.dept.Add(o));
orgs.ForEach(o => context.organization.Add(o));
fim.ForEach(o => context.fee_item.Add(o));
con_power.ForEach(o => context.control_power.Add(o));
context.SaveChanges();
}
public void initial()
{
try
{
var context = new FeeDbContext();
if (context.Database.Exists())
{
context.Database.Delete();
}
new List<IDataInitializer<FeeDbContext>>() {
new DataInit4dept()
}.Setup<FeeDbContext>(context);
}
catch (DbEntityValidationException ex)
{
StringBuilder error = new StringBuilder();
foreach (var item in ex.EntityValidationErrors)
{
foreach (var item2 in item.ValidationErrors)
{
error.Append(string.Format("{0}:{1}\r\n", item2.PropertyName, item2.ErrorMessage));
}
}
Console.WriteLine("数据库初始化报错:" + error);
throw ex;
}
catch (Exception e)
{
Console.WriteLine("数据库初始化报错:" + e.Message);
throw e;
}
}
ef code first写好之后就又到单元测试的部分了,所以要想每次执行单元测试内容的时候都执行一下以上内用就要用到单元测试的附属属性:
[ClassInitialize()] 在运行类的第一个测试前先运行代码
[ClassCleanup()] 在运行完类中的所有测试后再运行代码
[TestInitialize()] 在运行每个测试前先运行代码
[TestCleanup()] 在运行完每个测试后运行代码
[ClassInitialize]
public static void initialdb(TestContext context)
{
//初始化数据库
new DataBuilder().initial();
//加载webapi bin文件
apiconfig_factory.Instance.Load_Apis();
}
运行测试结果如下:
直到这单元测试的实现也就算结束了,但是对于单元测试还有很多东西没有往上写,比如测试模型,覆盖率等等,对于这个项目的测试也不仅限于单元测试,后边的性能测试和ui测试都会抽时间进行总结。
3.使用Moq模拟AspnetMvc中的Request.Form
3.1nuget下载安装moq
3.2.实例
1、比如Request.Form["MingCheng"]为control中需要模拟的内容
2、在单元测试中调用的代码
var formvalues = new NameValueCollection { { "ST_MingCheng", "" } };//可以选用KeyValuePair
var request = new NameValueCollection { { "pageIndex", "" } };
var mockHttpContext = new Mock<HttpContextBase>();
mockHttpContext.Setup(c => c.Request.QueryString).Returns(request);
mockHttpContext.Setup(c => c.Request.Form).Returns(formvalues);
Mock<SMSTemplateController> mockEnterprise = new Mock<SMSTemplateController>();
var context = new ControllerContext(mockHttpContext.Object, new RouteData(), stc);
stc.ControllerContext = context; //设置control的context熟悉
var result = stc._SMSTemplatelist(); //调用action方法
mvc+webapi 单元测试的更多相关文章
- ASP.NET Core MVC/WebAPi 模型绑定探索
前言 相信一直关注我的园友都知道,我写的博文都没有特别枯燥理论性的东西,主要是当每开启一门新的技术之旅时,刚开始就直接去看底层实现原理,第一会感觉索然无味,第二也不明白到底为何要这样做,所以只有当你用 ...
- 【MVC拾遗】MVC的单元测试简单学习总结
关于测试的必要性什么的已经在 重构与测试 里扯过了.倒也没必要说,写的代码多了自然就明白这个东西重要性. 当时说了坐等被推动去学习单元测试来着,然而等着被人推动的结果就是根本就没人来推你.o(∩_∩) ...
- 让Asp.net mvc WebAPI 支持OData协议进行分页查询操作
这是我在用Asp.net mvc WebAPI 支持 OData协议 做分页查询服务时的 个人拙笔. 代码已经开发到oschina上.有兴趣的朋友可以看看,欢迎大家指出不足之处. 看过了园子里的几篇关 ...
- MVC WebAPI 三层分布式框架开发
版权声明:本文为博主原创文章,未经博主允许不得转载. 前言:SOA(面向服务的架构)是目前企业应用开发过程中普遍采用的技术,基于MVC WebAPI三层分布式框架开发,以此适用于企业信息系统的业务处理 ...
- 启用 mvc webapi 的 session功能可用
默认 mvc webapi 不开启 session 会话支持 所以需要修改配置,在 Global 开启 session 支持 如下: 1.重写 init() 方法 public override vo ...
- .net和java和谐相处之安卓客户端+.net asp.net mvc webapi 2
作为没有花很多时间转java,把java当C#用的我,在做服务器端程序的时候,自然不想考虑java web,java需要学的框架太多了,看了一下Java Servlet,始终没有编码的冲动.经过几天的 ...
- 转载CSDN (MVC WebAPI 三层分布式框架开发)
前言:SOA(面向服务的架构)是目前企业应用开发过程中普遍采用的技术,基于MVC WebAPI三层分布式框架开发,以此适用于企业信息系统的业务处理,是本文论述的重点.此外,插件技术的应用,富客户端JQ ...
- Visual Studio 2015 Owin+MVC+WebAPI+ODataV4+EntityFrawork+Identity+Oauth2.0+AngularJS 1.x 学习笔记
2016年,.net 会有很多大更新 ASP.NET 5 在此之前我都是用着古老的.net做开发的 (WebForm + IIS) 为了接下来应对 .net 的新功能,我特地去学习了一下基本的 MVC ...
- MVC WebApi 用户验证 (2)
构建ASP.NET MVC5+EF6+EasyUI 1.4.3+Unity4.x注入的后台管理系统(66)-MVC WebApi 用户验证 (2) 前言: 构建ASP.NET MVC5+EF6+E ...
随机推荐
- SharpPcap网络包捕获框架的使用--实例代码在vs2005调试通过
转自:http://hi.baidu.com/boyxgb/blog/item/89ac86fbdff5f82c4e4aea2e.html 由于项目的需要,要从终端与服务器的通讯数据中获取终端硬件状态 ...
- Java 枚举类的基本使用
枚举(enum)类型是Java 5新增的特性,它是一种新的类型,允许用常量来表示特定的数据片断,而且全部都以类型安全的形式来表示. 1.常量的使用 在JDK1.5之前,我们定义常量都是:p ...
- docker入门记录1
一. 什么是Docker 1.英文意思是集装箱,很形象.直白点就是将程序运行环境打包在一个箱子里,然后箱子扔到哪里,里边的程序都可以运行.这样以来一个显而易见的好处是:和以前的开发环境等相比,你不用每 ...
- <<< Google hack
使用Google等搜索引擎对某些特定的网络主机漏洞(通常是服务器上的脚本漏洞)进行搜索,以达到快速找到漏洞主机或特定主机的漏洞的目的. 在SEO优化中,通常使用这种技术达到入侵一些网站挂外链之用.黑帽 ...
- <<< 将一个rar格式的文件变成一张jpg图片,按照后缀来选择打开他的模式
把一个压缩格式和一张图片合成,按照后缀来判断他打开是图片还是解压文件,后缀是jpg打开的就是一张图片,后缀是rar打开的就是一个压缩包,里面存放你放的东西 :例如(秘密) 准备一张图片,test. ...
- Google map markers
现已被屏蔽 http://mabp.kiev.ua/2010/01/12/google-map-markers/ Надо по немногу отходить от празднывания но ...
- ubuntu/var/log/下各个日志文件
ubuntu/var/log/下各个日志文件 本文简单介绍ubuntu/var/log/下各个日志文件,方便出现错误的时候查询相应的log /var/log/alternatives.log-更新 ...
- centos6.7设置非root帐户自动登录
1.在/etc/gdm/custom.conf文件中修改并加入以下这段 [daemon]AutomaticLogin=你的用户名AutomaticLoginEnable=True 2.重启 reboo ...
- C:Wordpress自定义文章类型(图视频)
自定义文章类型,包括: 1:单独的"文章内容模板" 2:单独的"文章列表模板" 3:单独的"控制后台"(文章分类.添加文章) 创建自定义文章 ...
- javascript数据结构与算法---检索算法
查找数据有2种方式,顺序查找和二分查找.顺序查找适用于元素随机排列的列表.二分查找适用于元素已排序的列表.二分查找效率更高,但是必须是已经排好序的列表元素集合. 一:顺序查找 顺序查找是从列表的第一个 ...