0

似乎随着 MVC4 的发布版本发生了一些变化,导致当从单元测试中测试操作结果时,不会调用自定义操作结果中的 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();

    }
4

1 回答 1

0

这是一个非常人为的示例,适用于 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);
    }
}
于 2012-08-27T05:57:08.973 回答