2009-10-05 36 views
0

我要測試的「項目」對象中的數據之前將其重定向到另一個動作。MVC MOQ單元測試RedirecToAction前的對象()

 public ActionResult WebPageEdit(WebPage item, FormCollection form) 
    { 
     if (ModelState.IsValid) 
     { 

      item.Description = Utils.CrossSiteScriptingAttackCheck(item.Description); 
      item.Content = Utils.CrossSiteScriptingAttackCheck(item.Content); 
      item.Title = item.Title.Trim(); 
      item.DateUpdated = DateTime.Now; 

      // Other logic stuff here 

      webPagesRepository.Save(item); 


      return RedirectToAction("WebPageList"); 
     } 

這裏是我的測試方法:

[Test] 
    public void Admin_WebPageEdit_Save() 
    { 

     var controller = new AdminController(); 

     controller.webPagesRepository = DataMock.WebPageDataInit(); 
     controller.categoriesRepository = DataMock.WebPageCategoryDataInit(); 

     FormCollection form = DataMock.CreateWebPageFormCollection(); 


     RedirectToRouteResult actionResult = (RedirectToRouteResult)controller.WebPageEdit(webPagesRepository.Get(1), form); 
     Assert.IsNotNull(actionResult); 

     Assert.AreEqual("WebPageList", actionResult.RouteValues["action"]); 


     var item = ((ViewResult)controller.WebPageEdit(webPagesRepository.Get(1), form)).ViewData.Model as WebPage; 

     Assert.NotNull(item); 



     Assert.AreEqual(2, item.CategoryID); 




    } 

它沒有在這一行:

var item = ((ViewResult)controller.WebPageEdit(webPagesRepository.Get(1), form)).ViewData.Model as WebPage; 

我在想有沒有在它之前測試「項目」對象的任何方式重定向到其他操作?

+1

請編輯您的問題,包括:1:代碼可以編譯可能(不是WebPageEdit的所有代碼路徑返回一個值)。 2:你收到的錯誤的描述。 –

回答

0

它失敗了,你可能知道的原因,那是你的控制器操作不會返回的ViewResult,只有RedirectToRouteResult(假設你沒有ellided一些代碼路徑)。您可能會在要重定向的操作中返回ViewResult,但您並未在此處測試該操作。

確定和測試項目對象的重定向之前的狀態,最好的辦法是與你的webPagesRepository對象的Save()方法的交互。據推測,從測試方法的名稱,你想測試,這個方法實際上被稱爲無論如何。因此,您應該對Save()方法有所期待。在此期望內,您可以檢查並確定傳遞給它的項目對象的狀態。這假定你的webPagesRepository是一個模擬的依賴。

我是犀牛嘲笑用戶,因此只有知道如何使用API​​設置的期望。讓我知道你是否會發現它有用,然後我會發布它。