Подтвердить что ты не робот

Как получить модель из ActionResult?

Я пишу unit test, и я вызываю метод действия, подобный этому

var result = controller.Action(123);

результат ActionResult, и мне нужно каким-то образом получить модель, кто-нибудь знает, как это сделать?

4b9b3361

Ответ 1

В моей версии ASP.NET MVC нет метода Action на контроллере. Однако, если вы имели в виду метод View, вот как вы можете unit test, чтобы результат содержал правильную модель.

Прежде всего, если вы только вернете ViewResult из определенного Action, объявите метод как возвращающий ViewResult вместо ActionResult.

В качестве примера рассмотрим это действие индекса

public ViewResult Index()
{
    return this.View(this.userViewModelService.GetUsers());
}

вы можете легко добраться до модели, как этот

var result = sut.Index().ViewData.Model;

Если ваш тип подписи подписи метода - ActionResult вместо ViewResult, вам нужно сначала перенести его в ViewResult.

Ответ 2

Мы поместили следующий фрагмент в testbase.cs, позволяющий вводить типизированные модели в тестах a la

ActionResult actionResult = ContextGet<ActionResult>();
var model = ModelFromActionResult<SomeViewModelClass>(actionResult);

ModelFromActionResult...

public T ModelFromActionResult<T>(ActionResult actionResult)
{
    object model;
    if (actionResult.GetType() == typeof(ViewResult))
    {
        ViewResult viewResult = (ViewResult)actionResult;
        model = viewResult.Model;
    }
    else if (actionResult.GetType() == typeof(PartialViewResult))
    {
        PartialViewResult partialViewResult = (PartialViewResult)actionResult;
        model = partialViewResult.Model;
    }
    else
    {
        throw new InvalidOperationException(string.Format("Actionresult of type {0} is not supported by ModelFromResult extractor.", actionResult.GetType()));
    }
    T typedModel = (T)model;
    return typedModel;
}

Пример использования страницы индекса и списка:

var actionResult = controller.Index();
var model = ModelFromActionResult<List<TheModel>>((ActionResult)actionResult.Result);

Ответ 3

рассмотрим a = ActionResult;

ViewResult p = (ViewResult)a;
p.ViewData.Model

Ответ 4

Это несколько обман, но очень простой способ сделать это в .NET4

dynamic result = controller.Action(123);

result.Model

Используется сегодня в unit test. Может стоить каких-то проверок здравомыслия, таких как:

Assert.IsType<ViewResult>(result); 
Assert.IsType<MyModel>(result.Model);

Assert.Equal(123, result.Model.Id);

Вы можете пропустить первый, если результатом будет просмотр или частичный результат в зависимости от ввода.