0

我試圖學習MVC結合IoC和DI。在我的項目中,我也使用Castle,Automapper,NHibernate,NHibernateIntegration。單元測試MVC控制器

感謝Kozmic的優秀示例「ToBeSeen」應用程序,我認爲我現在已經設置了很多解決方案。但是現在我想在控制器方法級別單元測試基本的保存操作。我只是沒有得到如何去做這件事。我期望我的問題很簡單,但我是一個新手在這個和任何幫助表示讚賞。

我有這樣的dossiercontroller:

[Authorize] 
    [Transactional] 
    public class DossierController : BaseController 
    { 
     private readonly IRepository repository; 
     private readonly IMappingEngine mappingEngine; 
     private readonly ILogger logger; 

     public DossierController(IRepository repository, IMappingEngine mappingEngine, ILogger logger) 
     { 
      this.repository = repository; 
      this.mappingEngine = mappingEngine; 
      this.logger = logger; 
     } 

正如你可以看到它需要一個repostitory,mappingengine和記錄。據我所知,所有這些都是在運行時進行配置和連接的。

接下來我有一個用來保存檔案的控制方法:

 [HttpPost] 
     [ActionName("Dossier")] 
     [Transaction] 
     [AcceptVerbs(HttpVerbs.Post)] 
     [AcceptParameter(Name = "button", Value = "save")] 
     public ActionResult Dossier_Save(string button, DossierModel dossierModel, string returnUrl) 
     { 
      if (!Request.IsAuthenticated) 
       return RedirectToAction("Index", "Home"); 

      if (!ModelState.IsValid) return View(dossierModel); 

      Dossier dossier = mappingEngine.Map<DossierModel, Dossier>(dossierModel); 

      repository.Save(dossier); 

      return View(); 
     } 

在這裏,我只是想給dossiermodel自動映射成一個檔案,並使用存儲庫保存。

現在我想單元測試這個使用Nunit。我不想嘲笑任何東西,我想要從控制器級別進行真正的持久性測試。爲此我必須創建一個新的卷宗控制器並傳入正確的參數。現在我輸了。如何創建和配置參數,以使它們在Web應用程序中完全相同。例如:如何在Unittest中創建一個正確配置的Automapper?如何創建一個正確配置的存儲庫?我應該使用容器嗎?

任何幫助,特別是代碼示例是高度讚賞!

在此先感謝。

回答

0

如果你不想嘲笑任何東西,你需要實例化控制器構造函數所需的服務的具體版本。

例如

IRepository repository = GetRepository(); 
IMappingEngine mappingEngine = GetMappingEngine(); 
ILogger logger = GetLogger(); 
DossierController controller = new DossierController(repository, mappingEngine, logger); 
ActionResult rsult = controller.Save(...etc...); 

至於你是如何配置和實例化這些,你就基本上需要做到這一點的正是你的MVC應用程序是這樣做相同的方式。

如果您不確定MVC應用程序中的哪些配置正在進行配置,我建議首先看看IoC配置並從那裏開始工作。

+0

謝謝!我是新來的,你有沒有嘲笑你的例子?親切的問候,海因 – Hein73

+0

模擬意味着你基本上建立了一個你的接口的假實例,並設置它返回預設的響應。您將需要使用圖書館嘲笑服務 - 我使用Rhino Mocks - 儘管我知道Moq很受歡迎。看看[link](http://hibernatingrhinos.com/open-source/rhino-mocks)爲一個基本的例子。 – StanK

+0

所以,如果我明白了Mocking意味着我不會訪問實際的數據庫。但是,我怎麼能單元測試控制器,看看它是否真的存在任何東西,如果我打電話給它?或者我不應該在控制器中調用實際的Save方法?現在我直接從控制器調用repository.save。這很聰明嗎?或不? – Hein73