Я пишу unit test, и я вызываю метод действия, подобный этому
var result = controller.Action(123);
результат ActionResult
, и мне нужно каким-то образом получить модель, кто-нибудь знает, как это сделать?
Я пишу unit test, и я вызываю метод действия, подобный этому
var result = controller.Action(123);
результат ActionResult
, и мне нужно каким-то образом получить модель, кто-нибудь знает, как это сделать?
В моей версии 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.
Мы поместили следующий фрагмент в 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);
рассмотрим a = ActionResult;
ViewResult p = (ViewResult)a;
p.ViewData.Model
Это несколько обман, но очень простой способ сделать это в .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);
Вы можете пропустить первый, если результатом будет просмотр или частичный результат в зависимости от ввода.