博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
对Controller的单元测试
阅读量:6708 次
发布时间:2019-06-25

本文共 1087 字,大约阅读时间需要 3 分钟。

hot3.png

在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等数据。

 

转载于:https://my.oschina.net/u/2327858/blog/914310

你可能感兴趣的文章
history.back(-1)和history.go(-1)的区别
查看>>
数据表删除、清空操作
查看>>
如何实现类似于:2017年10月17日 星期五 这种形式
查看>>
Java面向对象----Java面向对象(OOP)概念
查看>>
Linux下Moodle平台的快速安装方案
查看>>
京东招聘架构师 暂停招聘
查看>>
C# 判断是否是在设计模式下有效的方法
查看>>
JVM的内存管理
查看>>
beauty
查看>>
动态规划一:01背包问题
查看>>
ng generate
查看>>
MySQL数据操作
查看>>
django test 草稿
查看>>
UVa 11503 - Virtual Friends
查看>>
构建apache web 服务器
查看>>
内核和用户空间共享内存的实现例程-proc和mmap
查看>>
jquery 判断ul下是否存在li
查看>>
Backtrack5 R3实用新工具分析(上)
查看>>
如何解决在 beamer 中使用 utf8 的中文标签乱码问题
查看>>
NYOJ1238 最小换乘 (dijkstra)
查看>>