在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等數據。生命週期