對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的單元測試