在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:orm
用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等数据。生命周期