2010-05-19 142 views
0

我想測試提交的DTO的驗證。這是在控制器的裸骨創建動作:在asp.net中測試控制器mvc

[AcceptVerbs(HttpVerbs.Post)] 
     public RedirectToRouteResult Create(SomeDTO SomeDTO) 
     { 
      SomeObject SomeObject = null; 

      try 
      { 
SomeObject = this.RepositoryService.getSomeObjectRepository().Create(SomeDTO, this.RepositoryService); 
      } 
      catch (BrokenRulesException ex) 
      { 
       ex.AddModelStateErrors(ModelState, "Model"); 
      } 
      catch (Exception e) 
      { 
       ModelState.AddModelError("Exception", e.Message); 
      } 

      TempData["ViewData"] = ViewData; 
      TempData["SomeDTO "] = SomeDTO; 

      return ModelState.IsValid ? RedirectToAction("SomeObjectDetail", new { Id = SomeObject.Id }) : RedirectToAction("Form"); 
     } 

的力學,雖然不相關的,如下:我已強類型視圖=形式提交DTO到這個動作,其或者返回的形式或創建的對象的詳細信息頁面。

我想單元測試模型是否包含給定一些無效dto的某些key/errorMessage組合。有人做過類似的事情嗎?任何指針將非常感激。

謝謝。

最良好的祝願,

基督教

回答

1

在你的情況,我不認爲你真的要測試的模型狀態。相反,您應該簡單地使用測試設置來引發正確/不正確的模型狀態,然後測試在該條件下返回適當的結果。您可以使用單獨的測試來驗證模型有效/無效的各種條件,但是,如果您使用DataAnnotations,那麼在測試中他們和模型綁定基礎結構無法正常工作時,我沒有看到太多的重點。據推測,微軟已經這樣做了。

原有的基礎上的(錯誤的)假設,即是的ViewResult返回

我想應該是這樣的。

[TestMethod] 
public void TestCreate() 
{ 
    // set up 

    var result = Create(invalidDTO) as ViewResult; 

    var modelState = result.ViewData.ModelState; 

    Assert.IsFalse(modelState.IsValid); 

    var errors = modelState.Errors; 

    Assert.AreEqual(1, errors.Count); 
    Assert.AreEqual(errors[0].ErrorMessage, "some error message"); 
} 
+0

這看起來非常感謝。我明天會嘗試。謝謝。 – cs0815 2010-05-19 14:19:15

+0

@csetzkom - 可能有一些語法問題(我在我的Mac上),但這是基本的想法。 – tvanfosson 2010-05-19 14:22:48

+0

是啊謝謝,但我得到的想法 - 我認爲 - 將很快找到,然後接受你的回答 – cs0815 2010-05-19 14:31:47