如何从ActionResult获取模型?

Omu*_*Omu 23 asp.net-mvc unit-testing

我正在写一个单元测试,我称这样的动作方法

var result = controller.Action(123);
Run Code Online (Sandbox Code Playgroud)

结果是ActionResult,我需要以某种方式得到模型,任何人都知道如何做到这一点?

Mar*_*ann 33

在我的ASP.NET MVC版本中Action,Controller上没有方法.但是,如果您的意思是View方法,那么您可以通过单元测试结果是否包含正确的模型.

首先,如果只返回特定Action的ViewResult,则将该方法声明为返回ViewResult而不是ActionResult.

例如,请考虑此Index操作

public ViewResult Index()
{
    return this.View(this.userViewModelService.GetUsers());
}
Run Code Online (Sandbox Code Playgroud)

你可以像这样轻松地进入模型

var result = sut.Index().ViewData.Model;
Run Code Online (Sandbox Code Playgroud)

如果方法签名的返回类型是ActionResult而不是ViewResult,则需要先将其强制转换为ViewResult.

  • 最好转换为ViewResultBase(这包括部分); 也(很少)可以考虑使用反射来检查ViewData/Model属性并获取Model(如果有未知的视图结果类型). (5认同)

Max*_*Max 16

我们将以下部分放在testsbase.cs中,允许在测试中输入类型模型

ActionResult actionResult = ContextGet<ActionResult>();
var model = ModelFromActionResult<SomeViewModelClass>(actionResult);
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

使用索引页面和列表的示例:

var actionResult = controller.Index();
var model = ModelFromActionResult<List<TheModel>>((ActionResult)actionResult.Result);
Run Code Online (Sandbox Code Playgroud)

  • 伟大的我把它与http://mkramar.blogspot.com.au/2012/06/onactionexecuting-and-onactionexecuted.html结合起来(来自http://stackoverflow.com/questions/591720/how-do-i-unit- test-my-asp-net-mvc-controllers-onactionexecuting-method)所以它看起来像:ActionResult actionResult = Invoke(()=> new SomeController().Index()); var RestultViewModel = ModelFromActionResult <List <SomeRecords >>(actionResult); 现在非常满意这个测试. (3认同)

Omu*_*Omu 10

考虑a = ActionResult;

ViewResult p = (ViewResult)a;
p.ViewData.Model
Run Code Online (Sandbox Code Playgroud)