【问题标题】:unit testing custom actionresults in MVC4 not invoking executeresultMVC4中的单元测试自定义actionresults不调用executeresult
【发布时间】:2012-08-27 04:03:02
【问题描述】:

似乎随着 MVC4 的发布版本发生了一些变化,导致在从单元测试中测试操作结果时不会调用自定义 actionresult 中的 ExecuteResult 方法。

这是一个非常人为的示例,适用于 MVC3 和 MVC4 的早期版本。从单元测试运行时,执行结果永远不会“执行”。我在这里想念什么?其他人看到这种行为吗?

行动结果

public class SomeActionResult : ActionResult
{

    public override void ExecuteResult(ControllerContext context)
    {
        if (context == null)
        {
            throw new ArgumentNullException("null context");
        }

        var view = new ViewResult {ViewName = "index"};
        view.ExecuteResult(context);

    }

}

控制器动作

    [HttpPost]
    public ActionResult Index(string something)
    {
        return new SomeActionResult();
    }

单元测试(使用 MVCContrib)

    [Test]
    public void ShouldWork_but_doesnt_in_mvc4()
    {

        var controller = new HomeController();

        var result = controller.Index("test");

        result.AssertViewRendered();

    }

【问题讨论】:

    标签: asp.net-mvc unit-testing asp.net-mvc-4


    【解决方案1】:

    这是一个非常人为的示例,适用于 MVC3 和 MVC4 的早期版本。

    你一定是搞错了什么。这在 MVC 3、2、1 中也不起作用。这是预期的。因为单元测试意味着您正在孤立地对某些东西进行单元测试。因此,您有一个用于控制器操作的单元测试和另一个用于测试您的自定义操作结果的单元测试。

    不是Index 操作对操作结果调用ExecuteResult 结果方法。在执行用户请求期间,这在 MVC 执行管道中发生得更高。在您的单元测试中,您只需调用 Index 方法。

    因此,为了对这个控制器动作进行单元测试,您只需断言它返回正确类型的动作结果:

    [Test]
    public void Ensure_That_Index_Action_Return_SomeActionResult()
    {
        // arrange
        var controller = new HomeController();
    
        // act
        var result = controller.Index("test");
    
        // assert
        result.AssertResultIs<SomeActionResult>();
    }
    

    SomeActionResult 的另一个单元测试中,您将手动调用 ExecuteResult 方法并断言此自定义操作结果使用了ViewResult

    另外,让您的自定义操作结果从 ViewResult 派生而不是在 ExecuteResult 方法中手动实例化 ViewResult 并设置 ViewName 似乎更合适:

    public class SomeActionResult : ViewResult
    {
        public override void ExecuteResult(ControllerContext context)
        {
            this.ViewName = "Index";
            base.ExecuteResult(context);
        }
    }
    

    【讨论】:

    • 感谢您的精心回复。我遇到的问题是我的行动结果实际上比我给出的人为例子做得更多。你是对的,虽然我应该只测试控制器动作是否返回预期的动作结果类型;动作结果本身应该单独测试。我的实际操作结果是调用操作委托,然后返回成功操作或失败操作(两者都键入为 Func)。在操作结果“SuccessResult(result).ExecuteResult(context)”中进行一些验证后。
    • 好的,所以您可以对您的操作结果进行单独的单元测试。您对此还有其他问题吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-05
    • 2018-02-25
    • 2015-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多