2011-04-11 25 views
4

中にModelStateエラー辞書のエラーメッセージのように、私は行動の結果にキーと値のペアを追加しました:Iは単位にこれらのようないくつかの面倒なコードを有するアクセスASP.net MVCユニットテスト

 
[HttpPost, Authorize] 
     public ActionResult ListFacilities(int countryid) 
{ 
... 
     ModelState.AddModelError("Error","No facilities reported in this country!"); 
... 
} 

テストするには:

 
public void ShowFailforFacilities() 
{ 
    //bogus data 
    var facilities = controller.ListFacilities(1) as PartialViewResult; 


    Assert.AreSame("No facilities reported in this country!", 
     facilities.ViewData.ModelState["Error"].Errors.FirstOrDefault().ErrorMessage); 

} 

もちろん、エラーが1つしかない場合はいつでも動作します。
私はfacilities.ViewData.ModelState["Error"].Errors.FirstOrDefault().ErrorMessageが好きではありません。

私はその辞書から値を取得する簡単な方法はありますか?

答えて

12

ErrorMessageにアクセスするとNullReferenceExceptionが発生するため、FirstOrDefaultは不要です。 First()を使うことができます。

いずれにしても、組み込みの解決策が見つかりませんでした。このように動作します

public static class ExtMethod 
    { 
     public static string GetErrorMessageForKey(this ModelStateDictionary dictionary, string key) 
     { 
      return dictionary[key].Errors.First().ErrorMessage; 
     } 
    } 

::私が代わりにやったことは拡張メソッドの作成である

あなたが複数のエラーのためのより良い例外処理、またはサポートが必要な場合
ModelState.GetErrorMessageForKey("error"); 

、その簡単に拡張することを... 。

あなたはこれを短くしたい場合はViewDataをのための拡張メソッドを作成することができます...

public static class ExtMethod 
    { 
     public static string GetModelStateError(this ViewDataDictionary viewData, string key) 
     { 
      return viewData.ModelState[key].Errors.First().ErrorMessage; 
     } 
    } 

と用法:

ViewData.GetModelStateError("error"); 
+0

非常にうまく答えてくれてありがとうございます。 – Seen

+0

良い解決策。ありがとうございました! –

+0

も参照してください。http://stackoverflow.com/questions/17580944/get-all-modelstate-errors-on-view – Alexey

0

これを試しましたか?

// Note: In this example, "Error" is the name of your model property. 
facilities.ViewData.ModelState["Error"].Value 
facilities.ViewData.ModelState["Error"].Error 
関連する問題