2010-12-05 26 views
1

更新

我最近修改了一個視圖來發布給它的控制器一個json對象而不是一個formcollection。單元測試MVC 3.0內的UpdateModel方法

爲了得到這個控制器工作的單元測試,我們將formvalue提供程序設置爲一個字典對象,以停止UpdateModel方法拋出nre的方法。

然而,下面的結果單元測試根本不覺得正確的做法。任何深入瞭解如何返工這將不勝感激。

[HttpPost] 
    public ActionResult ThemeContent(content model) 
    { 
     if (ModelState.IsValid) 
     { 
      var content = _contentRepository.GetContent(model.id); 
      if (content == null) 
      { 
       content = new content(); 
       UpdateModel(content); 
       _contentRepository.Add(content); 
       _contentRepository.Save(); 
      } 
      else 
      { 
       UpdateModel(content); 
       _contentRepository.Save(); 
      } 

      return Json(new 
      { 
       redirectUrl = Url.Action("index", "success", new {id = content.id}), 
       isRedirect = true 
      }); 
     } 

     string errorMessage = "{"; 

     foreach (var key in ModelState.Keys) 
     { 
      var error = ModelState[key].Errors.FirstOrDefault(); 
      if (error != null) 
      { 
       if (errorMessage != "{") 
       { 
        errorMessage += ","; 
       } 
       errorMessage += (char) 34 + "#" + key + (char) 34 + ":" + (char) 34 + error.ErrorMessage + (char) 34; 
      } 
     } 

     errorMessage += "}"; 

     return Json(new 
     { 
      Message = errorMessage, 
      isRedirect = false 
     }); 

    } 

在此先感謝。

+0

我不是很清楚爲什麼你調用UpdateModel,當你已經有所有的值需要從模型綁定到動作參數中的「model」對象。 – 2010-12-06 22:10:08

+0

感謝您指出布拉德。愚蠢的監督,這大大增加了我們測試的複雜性。 – Jesse 2010-12-07 01:12:29

回答

0

更新,因爲我們錯誤地使用updatemodel方法。

 //setup 
     var fakeContent = new content 
     { 
      address1 = "123 test street" 
     }; 

     _controller.Url = new UrlHelper(
      new RequestContext(
       _controller.HttpContext, new RouteData() 
       ), 
      new RouteCollection() 
      ); 

     //execute 
     var result = _controller.ThemeContent(fakeContent) as JsonResult(); 

     //assert 
     Assert.AreEqual("123 test street", _content.address1); 
0

如果控制器正在嘗試測試依賴它的操作,那麼您需要在單元測試中模擬控制器上下文。我強烈建議你看看MVCContrib.TestHelper這將簡化模擬這個上下文的任務,並使你的單元測試更加優雅。

+0

謝謝Darin。我已經添加了對TestHelper的參考,並且今天下午一直在玩它。你有沒有機會舉一個例子來說明當被測控制器更新模型時如何正確創建單元測試? – Jesse 2010-12-06 02:14:35