2010-09-22 323 views
1

我剛剛創建了一個動作過濾器,我想將其應用於幾乎所有控制器(包括稍後介紹的任何新控制器)。單元測試從單個測試中的所有控制器

我認爲一個真正有用的單元測試將循環遍歷每個控制器,並驗證如果滿足某些條件,那麼動作過濾器將影響結果。

創建命中多個控制器的單元測試是明智嗎?任何人都可以從類似的測試中分享已經證明有用的代碼嗎?

編輯:剛纔意識到testing an action filter可能有問題。不過,如果你有想法,分享控制器的質量檢測......

回答

3

建議不要在測試中一次測試多個事物。

您還應該避免測試中的邏輯(開關,if,else,foreach,while,while),因爲測試的可讀性較差並且可能引入隱藏的錯誤。

許多簡單的,可讀的,因此維護的測試,只是在測試一件事每個都遠遠優於有很多複雜的一個測試。

響應你EDIT

測試過濾器可以通過從屬性分離濾波器來實現。下面是一個例子:LoadMembershipTypeListFilter類具有使用測試假貨所需的'接縫'。這是你的過濾器中的邏輯就是要測試的地方。

public class LoadMembershipTypeListFilter : IActionFilter 
{ 
    private IMembershipTypeProvider _provider; 
    private IMembershipTypeAdminMapper _mapper; 

    public LoadMembershipTypeListFilter(IMembershipTypeProvider provider, IMembershipTypeAdminMapper mapper) 
    { 
     _provider = provider; 
     _mapper = mapper; 
    } 

    #region IActionFilter Members 
    public void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
    } 

    public void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     //implementation... 
    } 
    #endregion 
} 

而且這裏的屬性,使用過濾器,這個例子中通過向服務定位器的調用解決了過濾器需要依賴:

public class LoadMembershipTypeListAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     var filter = new LoadMembershipTypeListFilter(IocResolve.Resolve<IMembershipTypeProvider>(), IocResolve.Resolve<IMembershipTypeAdminMapper>()); 
     filter.OnActionExecuting(filterContext); 
    } 
} 

而且你的控制器使用的屬性:

[LoadMembershipTypeList] 
public ActionResult Create() 
{ 
    return View(); 
} 
+0

可測試性示例。 – 2010-09-22 23:22:16

2

既然你最有可能會寫的每個控制器單元測試,無論如何,你總是可以只是有測試行爲過濾單元測試基類。任何使用動作過濾器的控制器測試都會從這個類繼承來測試動作過濾器。

1

我想說的是你正在測試基礎設施。如果要檢查過濾器是否應用於您期望的方法中,請使用反射+匹配您希望匹配的方法列表。

也許你確實想檢查這些方法是否有特定的簽名,上面的方法也適用於此。

如果你想測試操作篩選,直接違背它。也許你真正需要的是確保不同的結果/模型與過濾器一起工作。