Asp.net-Mvc
ASP.NET MVC - 單元測試矯枉過正?(TDD)
所以我開始發現 TDD 錯誤,但我想知道我是否真的做對了……我似乎正在編寫很多測試。
當然,測試越多越好,但我有一種感覺,我已經結束了。老實說,我不知道我能堅持寫這些簡單的重複測試多久。
例如,這些是來自我的 AccountController 的 LogOn 操作:
public ActionResult LogOn(string returnUrl) { if (string.IsNullOrEmpty(returnUrl)) returnUrl = "/"; var viewModel = new LogOnForm() { ReturnUrl = returnUrl }; return View("LogOn", viewModel); } [AcceptVerbs(HttpVerbs.Post)] public ActionResult LogOn(LogOnForm logOnForm) { try { if (ModelState.IsValid) { AccountService.LogOnValidate(logOnForm); FormsAuth.SignIn(logOnForm.Email, logOnForm.RememberMe); return Redirect(logOnForm.ReturnUrl); } } catch (DomainServiceException ex) { ex.BindToModelState(ModelState); } catch { ModelState.AddModelError("*", "There was server error trying to log on, try again. If your problem persists, please contact us."); } return View("LogOn", logOnForm); }很不言自明。
然後我有以下一組測試
public void LogOn_Default_ReturnsLogOnView() public void LogOn_Default_SetsViewDataModel() public void LogOn_ReturnUrlPassedIn_ViewDataReturnUrlSet() public void LogOn_ReturnUrlNotPassedIn_ViewDataReturnUrDefaults() public void LogOnPost_InvalidBinding_ReturnsLogOnViewWithInvalidModelState() public void LogOnPost_InvalidBinding_DoesntCallAccountServiceLogOnValidate() public void LogOnPost_ValidBinding_CallsAccountServiceLogOnValidate() public void LogOnPost_ValidBindingButAccountServiceThrows_ReturnsLogOnViewWithInvalidModelState() public void LogOnPost_ValidBindingButAccountServiceThrows_DoesntCallFormsAuthServiceSignIn() public void LogOnPost_ValidBindingAndValidModelButFormsAuthThrows_ReturnsLogOnViewWithInvalidModelState() public void LogOnPost_ValidBindingAndValidModel_CallsFormsAuthServiceSignIn() public void LogOnPost_ValidBindingAndValidModel_RedirectsToReturnUrl()殺完了嗎?我什至沒有展示服務測試!
我可以剔除哪些(如果有)?
TIA,
查爾斯
這完全取決於您需要/想要多少覆蓋範圍以及有多少可靠性是一個問題。
以下是您應該問自己的問題:
- 此單元測試是否有助於實現我還沒有的功能/程式碼更改?
- 如果我稍後進行更改,此單元測試是否有助於回歸測試/調試此單元?
- 滿足此單元測試的程式碼是重要的還是值得進行單元測試?
關於第三個,我記得當我開始編寫單元測試時(我知道,與 TDD 不同),我會進行如下測試:
string expected, actual; TypeUnderTest target = new TypeUnderTest(); target.PropertyToTest = expected; actual = target.PropertyToTest; Assert.AreEqual<string>(expected, actual);我本可以利用我的時間做一些更有成效的事情,比如為我的桌面選擇更好的桌面。
我推薦 ASP.net MVC 書籍作者 Sanderson 的這篇文章:
<http://blog.codeville.net/2009/08/24/writing-great-unit-tests-best-and-worst-practises/>