Как получить модель из ActionResult? - PullRequest
23 голосов
/ 15 января 2010

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

var result = controller.Action(123);

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

Ответы [ 4 ]

33 голосов
/ 15 января 2010

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

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

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

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

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

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

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

16 голосов
/ 25 апреля 2012

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

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);
10 голосов
/ 15 января 2010

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

ViewResult p = (ViewResult)a;
p.ViewData.Model
2 голосов
/ 28 октября 2014

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

dynamic result = controller.Action(123);

result.Model

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...