4

カスタムActionFilterAttributeを単体テストしようとしています。例えば:

public class ActionAuthorizationAttribute: ActionFilterAttribute 
{

  protected override void  OnActionExecuted(ActionExecutedContext filterContext)
  {
    filterContext.HttpContext.Response.Redirect("SecurityException");
  }
}

この属性を持つアクションがSecurityExceptionにリダイレクトされることをテストする単体テストを作成するにはどうすればよいですか。

私の試み

[TestClass]
public class TestControllerResponse
{
  [TestMethod]
  public void TestPermissionAccepted()
  {
    var controller = new TestController();
    var result = controller.Index() as RedirectToRouteResult;
    Assert.IsNotNull(result);
    Assert.AreEqual("SecurityException", result.RouteValues["action"]);
  }
}

protected class TestController : Controller
{
  [ActionAuthorization]
  public ActionResult Index()
  {
    return RedirectToAction("UnfortunatelyIWasCalled");
  }

}

残念ながら、テストは失敗します。インデックスアクションは、「SecurityException」ではなく「UnfortunatelyIWasCalled」にリダイレクトされます。

4

1 に答える 1

1

アクション フィルターの動作をテストするために、コントローラーのアクションを単体テストしません。それらは 2 つの別個の懸念事項です。たとえば、誰かが ActionAuthorizeAttribute の OnActionExecutedMethod を変更して別の例外を返すと、コントローラーのアクションの単体テストは間違った理由で失敗します。これは、アクションをテストしているためですが、コードは ActionFilter 内で他の何かもテストしています。単体テストとは、作業単位の動作を分離して検証することです。本当に ActionFilter をテストしたい場合は、フィルターを個別に単体テストします。アクションが実行された後に ActionFilter が呼び出されるかどうかは別の問題であり、MVC フレームワークによって既にテストされています。

于 2012-07-01T02:49:38.213 に答える