2010-09-22 224 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

我想说的是你正在测试基础设施。如果要检查过滤器是否应用于您期望的方法中,请使用反射+匹配您希望匹配的方法列表。

也许你确实想检查这些方法是否有特定的签名,上面的方法也适用于此。

如果你想测试操作筛选,直接违背它。也许你真正需要的是确保不同的结果/模型与过滤器一起工作。