2010-05-27 39 views
2

這是更多的意見尋求問題,所以可能沒有「正確」的答案,但我會歡迎你爲什麼答案是「正確」的論點。ASP.NET MVC單元測試控制器 - 知識庫

由於使用實體框架的持久化引擎的MVC應用程序,存儲庫層,基本上推遲到倉庫服務層和控制器上的刪除方法,看起來像這樣:

public ActionResult Delete(State model) 
    { 
     try 
     { 
      if(model == null) 
      { 
       return View(model); 
      } 

      _stateService.Delete(model); 

      return RedirectToAction("Index"); 
     } 
     catch 
     { 
      return View(model); 
     } 
    } 

我正在尋找適當的方式來測試這個單元。目前,我有被在服務中使用的假倉庫,和我的單元測試是這樣的:

[TestMethod] 
    public void Delete_Post_Passes_With_State_4() 
    { 
     //Arrange 
     var stateService = GetService(); 
     var stateController = new StateController(stateService); 

     ViewResult result = stateController.Delete(4) as ViewResult; 
     var model = (State)result.ViewData.Model; 

     //Act 
     RedirectToRouteResult redirectResult = stateController.Delete(model) as RedirectToRouteResult; 

     stateController = new StateController(stateService); 

     var newresult = stateController.Delete(4) as ViewResult; 
     var newmodel = (State)newresult.ViewData.Model; 

     //Assert 
     Assert.AreEqual(redirectResult.RouteValues["action"], "Index"); 
     Assert.IsNull(newmodel); 
    } 

這是大材小用?我是否需要檢查記錄是否真的被刪除(因爲我已經有Service和Repository測試驗證了這一點)?我是否應該在這裏使用虛假的存儲庫,或者只是爲了嘲笑整個事情會更有意義?

我看到的例子使用了這種模型,我只是複製了它,但我真的很樂意以「最佳實踐」的方式做事。

謝謝。

回答

2

我個人在這種情況下會使用假貨服務。

由於事情的聲音,你已經有服務測試,所以你不需要測試服務刪除在這裏只是控制器。

至於你的其他測試,我會用一個虛擬庫來測試服務層。至於測試版本庫,我將有一個測試數據庫設置來測試所有的方法,並確保有一種方法可以將數據庫恢復到原始設置,所以每次運行測試時都要測試相同的數據。

+1

同意。如果此代碼正在測試控制器,則服務和存儲庫應該是假貨/存根。 – PatrickSteele 2010-05-27 15:16:01

0

我同意,如果你在其他地方測試過其他層等,則不需要測試控制器。

我不同意上面的答案,因爲數據庫不是我認爲最好的測試方法。它比在內存列表中使用要慢,但正如Simon所說,你需要編寫清理代碼來確保數據庫返回到中立狀態。

這意味着您不太可能編寫和運行測試。

再次ypou沒有測試數據庫。您正在測試您的控制器。

+0

上面的海報指定他會使用測試數據庫來測試實際的存儲庫代碼。當然,你可以通過使用假名來測試大多數關卡,但是當涉及到真正測試存儲庫代碼(實際與數據庫對話的代碼)時,測試它的唯一方法是讓它實際與數據庫進行交談。如果你用一個假的代替倉庫,那麼你並沒有真的測試倉庫。你正在測試假... – 2010-06-10 22:07:53