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 单元测试的更多相关文章

  1. ASP.NET Core MVC/WebAPi 模型绑定探索

    前言 相信一直关注我的园友都知道,我写的博文都没有特别枯燥理论性的东西,主要是当每开启一门新的技术之旅时,刚开始就直接去看底层实现原理,第一会感觉索然无味,第二也不明白到底为何要这样做,所以只有当你用 ...

  2. 【MVC拾遗】MVC的单元测试简单学习总结

    关于测试的必要性什么的已经在 重构与测试 里扯过了.倒也没必要说,写的代码多了自然就明白这个东西重要性. 当时说了坐等被推动去学习单元测试来着,然而等着被人推动的结果就是根本就没人来推你.o(∩_∩) ...

  3. 让Asp.net mvc WebAPI 支持OData协议进行分页查询操作

    这是我在用Asp.net mvc WebAPI 支持 OData协议 做分页查询服务时的 个人拙笔. 代码已经开发到oschina上.有兴趣的朋友可以看看,欢迎大家指出不足之处. 看过了园子里的几篇关 ...

  4. MVC WebAPI 三层分布式框架开发

    版权声明:本文为博主原创文章,未经博主允许不得转载. 前言:SOA(面向服务的架构)是目前企业应用开发过程中普遍采用的技术,基于MVC WebAPI三层分布式框架开发,以此适用于企业信息系统的业务处理 ...

  5. 启用 mvc webapi 的 session功能可用

    默认 mvc webapi 不开启 session 会话支持 所以需要修改配置,在 Global 开启 session 支持 如下: 1.重写 init() 方法 public override vo ...

  6. .net和java和谐相处之安卓客户端+.net asp.net mvc webapi 2

    作为没有花很多时间转java,把java当C#用的我,在做服务器端程序的时候,自然不想考虑java web,java需要学的框架太多了,看了一下Java Servlet,始终没有编码的冲动.经过几天的 ...

  7. 转载CSDN (MVC WebAPI 三层分布式框架开发)

    前言:SOA(面向服务的架构)是目前企业应用开发过程中普遍采用的技术,基于MVC WebAPI三层分布式框架开发,以此适用于企业信息系统的业务处理,是本文论述的重点.此外,插件技术的应用,富客户端JQ ...

  8. Visual Studio 2015 Owin+MVC+WebAPI+ODataV4+EntityFrawork+Identity+Oauth2.0+AngularJS 1.x 学习笔记

    2016年,.net 会有很多大更新 ASP.NET 5 在此之前我都是用着古老的.net做开发的 (WebForm + IIS) 为了接下来应对 .net 的新功能,我特地去学习了一下基本的 MVC ...

  9. MVC WebApi 用户验证 (2)

    构建ASP.NET MVC5+EF6+EasyUI 1.4.3+Unity4.x注入的后台管理系统(66)-MVC WebApi 用户验证 (2)   前言: 构建ASP.NET MVC5+EF6+E ...

随机推荐

  1. iOS地图 -- 区域监听的实现和小练习

    区域监听用到的方法 [self.mgr startMonitoringForRegion:region]; --> 开启区域监听,没有返回值,在代理方法中得到信息并且处理信息 注:该方法只有用户 ...

  2. 【USACO 2.4】Overfencing(bfs最短路)

    H行W列的迷宫,用2*H+1行的字符串表示,每行最多有2*W+1个字符,省略每行后面的空格.迷宫的边界上有且仅有两个出口,求每个点出发到出口的最短路. +-+-+-+-+-+ | | +-+ +-+ ...

  3. Git从入门到学会

    Git简介 Git是什么? Git和SVN一样都是一种高效的管理代码的系统. Git是目前世界上最先进的分布式版本控制系统(没有之一). 创建版本库 什么是版本库呢?版本库又名仓库,英文名reposi ...

  4. 【poj1742】 Coins

    http://poj.org/problem?id=1742 (题目链接) 题意 给出n钟纸币,每种纸币面值为a[i],数量为c[i],问能够成多少数值小于等于m的数. Solution 先想到了容斥 ...

  5. windows下 nvm下载node被墙了解决办法

    不需要这么麻烦的,在1.1.1版本中,确实没有实现命令行设置.这点你分析的很对,但是从配置文件中读取镜像地址已经完成,所以直接在settings.txt中手工设置一下就好了,无需编译.以下是我的文件位 ...

  6. <<< Js中实现对字符串的截取

    1.函数split() 功能:使用一个指定的分隔符把一个字符串分割存储到数组 例:var Data = "1/234/5678/9"; var str = shuju.split( ...

  7. C#之数组篇

    大杂烩 一.数组初始化 1.一维数组 String[] str = new String[3] { "1","2","3"};        ...

  8. 表单提交按钮input和button、a的差异

    现在普遍的在网页中,表单提交数据的按钮最常见实用有三种,一种是input,一种是button,最后一种,是其他如a标签,div标签,span标签代替而来.在以前的日子里,大家都习惯于用input,因为 ...

  9. 4、JavaScript

    一.JavaScript的概念:是基于对象和事件的脚本语言. 1.特点: a).安全性. b).跨平台性(只要可以解释JS的浏览器就可以执行,和平台无关) 2.JavaScript与Java的区别: ...

  10. idea导入maven项目,web browser远程单步调试

    问题:之前用idea14.1.3导入maven项目后,maven的dependencies不能自动解决依赖,到处都是红色的红线,看着就受不了.虽然不影响命令行编译,但是看着实在是不爽.总结下面几小步: ...