2012-06-27 26 views
4

我想單元測試一個自定義的ActionFilterAttribute。例如:如何測試ActionFilterAttribute - OnActionExecuted

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"); 
    } 

} 

不幸的是,測試失敗。索引操作重定向到「LaterIWasCalled」而不是「SecurityException」。

+1

爲什麼你要對控制器類進行單元測試,如果它是你想測試的ActionAuthorizationAttribute類的話? – Morten

回答

1

我不會測試控制器的Action來測試Action Filter的行爲。他們是兩個不同的問題。例如,如果有人去更改ActionAuthorizeAttribute的OnActionExecutedMethod以返回一個不同的異常,那麼Controller Controller的Action上的單元測試會因錯誤的原因而失敗。這是因爲,您正在測試Action,但您的代碼也在ActionFilter中測試了其他內容。單元測試就是單獨驗證一個工作單元的行爲。如果你真的想測試ActionFilter,我會單獨測試過濾器。 ActionFilter是否在你的Action被執行後被調用是一個單獨的問題,並且已經被MVC框架測試過了。