Доступ к сообщению об ошибке в словаре ошибок ModelState в модульном тесте ASP.net MVC - PullRequest
4 голосов
/ 11 апреля 2011

Я добавил пару ключ-значение в результате действия, как это:

[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);

 }

Конечно, это работает, когда у меня только одна ошибка.
Мне не нравится facilities.ViewData.ModelState["Error"].Errors.FirstOrDefault().ErrorMessage.

Есть ли для меня более простой способ получить значение из этого словаря?

Ответы [ 2 ]

12 голосов
/ 11 апреля 2011

Ваш FirstOrDefault не нужен, потому что вы получите NullReferenceException при доступе к ErrorMessage.Вы можете просто использовать 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 голосов
/ 11 апреля 2011

Вы пробовали это?

// Note: In this example, "Error" is the name of your model property.
facilities.ViewData.ModelState["Error"].Value
facilities.ViewData.ModelState["Error"].Error
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...