0

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();

    }
4

1 に答える 1

0

これは、MVC3および以前のバージョンのMVC4で機能する非常に工夫された例です。

あなたは何かを間違えたに違いありません。これはMVC3、2、1でも機能しません。そしてそれは期待されています。ユニットテストとは、何かを単独でユニットテストしていることを意味するからです。したがって、コントローラーアクションの単体テストとカスタムアクションの結果をテストする単体テストがあります。

アクション結果でresultメソッドを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ます。

また、ExecuteResultメソッド内でViewResultを手動でインスタンス化して、ViewNameを設定するよりも、カスタムアクションの結果をViewResultから派生させる方が適切と思われます。

public class SomeActionResult : ViewResult
{
    public override void ExecuteResult(ControllerContext context)
    {
        this.ViewName = "Index";
        base.ExecuteResult(context);
    }
}
于 2012-08-27T05:57:08.973 に答える