对Controller的单元测试
在ASP.NET MVC项目的Controller中存在逻辑代码,也需要单元测试。查阅到的资料上,有说ASP.NET MVC框架在设计时便考虑到了满足可测试性,所以相对aspx、Winform来说针对MVC的单元测试要更容易。
一 基本使用
原来对Controller的单元测试的并不像此前自己想的那么复杂,本质还是对一个代码单元的功能测试。如果不涉及HttpContext的模拟,使用方法基本与之前对Service层的单元测试方法一致,但会多了一些Arrange操作,因为Controller又会调用Service。测试Login的Post动作在验证码错误时的行为的测试代码为:
主要是在刚开始的时候不知道TempData如何设置,原来可以直接这样:auController.TempData[Consts.VERIFY_CODE_KEY] = "VerifyCode_Error",TempData是ControllerBase的属性,而Controller都继承自ControllerBase。
但Session却不能用类似的方法赋值,否则会报空引用错误,Session是只读属性,而且Session应该不在Controller的生命周期内,到底具体怎么做还不知道。
二 模拟HttpContext和HttpRequest
对于单元测试来说,网络与数据库一样都是外部依赖,之前只模拟过数据库,现在可以用类似的方式模拟网络请求了。比如Controller的一个Action需要读取网络请求中的QueryString:
用Substitute.For方法分别模拟了HttpContextBase和HttpRequestBase对象。通过这儿还学到NSubstitute也是能模拟属性的返回值的,与指定方法的返回值时类似:httpRequest.QueryString.Returns(queryString)。
在这段代码中,也可以大概了解ASP.NET MVC中相关对象之间的关系:Controller->ControllerContext->HttpContext->HttpRequest,前者依次包含后者。
代码var result = auController.Index() as ViewResult将Index返回的ActionResult转换为其子类ViewResult,可以针对ViewResult验证Model、ViewBag、ViewData等数据。
对Controller的单元测试的更多相关文章
- Spring Boot 2 实践记录之 封装依赖及尽可能不创建静态方法以避免在 Service 和 Controller 的单元测试中使用 Powermock
在前面的文章中(Spring Boot 2 实践记录之 Powermock 和 SpringBootTest)提到了使用 Powermock 结合 SpringBootTest.WebMvcTest ...
- ASP.NET Core 对Controller进行单元测试
单元测试对我们的代码质量非常重要.很多同学都会对业务逻辑或者工具方法写测试用例,但是往往忽略了对Controller层写单元测试.我所在的公司没见过一个对Controller写过测试的.今天来演示下如 ...
- 如何对Spring MVC中的Controller进行单元测试
对Controller进行单元测试是Spring框架原生就支持的能力,它可以模拟HTTP客户端发起对服务地址的请求,可以不用借助于诸如Postman这样的外部工具就能完成对接口的测试. 具体来讲,是由 ...
- MockMvc模拟对controller进行单元测试
本文为博主原创,未经允许不得转载: MockMvc实现了对Http请求的模拟,能够直接使用网络的形式,转换到Controller的调用,这样可以使得测试速度快.不依赖网络环境, 而且提供了一套验证的 ...
- 【maven】【spring boot】【单元测试】 使用controller 执行单元测试类
存在这样一个场景: 当项目启动时间过长,又没办法缩短的时候,写单元测试就是一个十分耗时的工作, 这工作不在于使用编写代码,而在于每次run junit test 都需要完整启动一次项目,白白浪费宝贵的 ...
- 使用Spring MockMVC对controller做单元测试(转)
https://www.cnblogs.com/ylty/p/6420738.html 1.对单一controller做测试. import org.junit.Before; import org. ...
- MockMvc 进行 controller层单元测试 事务自动回滚 完整实例
package com.ieou.ms_backend.controller; import com.google.gson.Gson; import com.ieou.ms_backend.dto. ...
- 使用Spring MockMVC对controller做单元测试
1.对单一controller做测试. import org.junit.Before; import org.junit.Test; import org.springframework.beans ...
- springBoot中“MockMvc”的进行Controller进行单元测试:application/octet-stream' not supported问题小结
解决方案:这个问题其实是Content-type的问题,只需要在相关的代码加入相关Content-type中就可以了,代码如下: mockMvc.perform(post("/user&qu ...
随机推荐
- 架构模式数据源模式之:数据映射器(Data Mapper)
一:数据映射器 关系型数据库用来存储数据和关系,对象则可以处理业务逻辑,所以,要把数据本身和业务逻辑糅杂到一个对象中,我们要么使用 活动记录,要么把两者分开,通过数据映射器把两者关联起来. 数据映射器 ...
- 课程一(Neural Networks and Deep Learning),第三周(Shallow neural networks)—— 3.Programming Assignment : Planar data classification with a hidden layer
Planar data classification with a hidden layer Welcome to the second programming exercise of the dee ...
- sql练习(针对Mysql)
创建表: DROP TABLE DEPT; --部门表 CREATE TABLE DEPT( DEPTNO int PRIMARY KEY, DNAME ) , --部门名称 LOC ) ---部门地 ...
- IE不兼容document.getElementsByClassName
在DOM3里已经加入了getElementsByClassName这个方法,然而IE9.10以外的其它版本均不支持,这是一块伤痛啊! 目前可以这么解决,判断浏览器支不支持这个方法,如果支持就不管:如果 ...
- Form表单中不同的按钮进行不同的跳转
本文参考:http://my.oschina.net/sallency/blog/300568 在开发工作共我们往往会遇到一个表单需要包含多个action不同的提交动作,这时候就不能在使用submit ...
- c++的动态绑定和静态绑定
为了支持c++的多态性,才用了动态绑定和静态绑定. 1.对象的静态类型:对象在声明时采用的类型.是在编译期确定的. 2.对象的动态类型:目前所指对象的声明.在运行期决定.对象的动态类型可以更改,但是静 ...
- 分享.NET 轻量级的ORM
ORM https://github.com/StackExchange/dapper-dot-net http://fluentdata.codeplex.com/ https://github.c ...
- Docker概念学习系列之为什么使用docker?(3)
不多说,直接上干货! 见[博主]撰写的https://mp.weixin.qq.com/s/FFSIOSecVdAr_aSDIFZwSA Docker容器虚拟化的优点: (1)环境隔离: 通过cgro ...
- Spring Boot项目的内嵌容器
一.关于容器 刚才开始使用spring boot的开发者会有种很直观的感觉,servlet容器“不见了”.之前开发web项目,都是把程序写完后部署到servlet容器(比如Tomcat),但是使用sp ...
- Tomcat学习总结(15)—— Tomcat优化时的参数分析
(1).maxHttpHeaderSize=”8192” 此选项用于配置:来自于客户端请求的Request和Response的HTTP header 的最大长度,以字节计算.如果不设置,该属性为409 ...