代码之家  ›  专栏  ›  技术社区  ›  Mayo

从单个测试单元测试所有控制器

  •  1
  • Mayo  · 技术社区  · 14 年前

    我刚刚创建了一个动作过滤器,我想应用到几乎所有的控制器上(包括后面介绍的任何新控制器)。

    我认为一个真正有用的单元测试应该是循环遍历每个控制器,并验证如果满足某些条件,那么动作过滤器将影响结果。

    创建一个命中多个控制器的单元测试明智吗?任何人都可以共享一个类似测试的代码吗?

    testing an action filter 可能有问题。不过,如果你有想法分享大规模测试控制器。。。

    3 回复  |  直到 7 年前
        1
  •  3
  •   CRice    14 年前

    不建议在测试中一次测试多件事情。

    您还应该避免测试中的逻辑(switch、if、else、foreach、for、while),因为测试可读性较差,可能会引入隐藏的bug。

    回复您的编辑

    测试过滤器可以通过从属性中分离过滤器来实现。下面是一个示例: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();
    }
    
        2
  •  2
  •   cHao    14 年前

    因为您很可能要为每个控制器编写单元测试,所以您总是可以有一个单元测试基类来测试操作过滤器。任何使用动作过滤器的控制器测试都会继承这个类来测试动作过滤器。

        3
  •  1
  •   eglasius    14 年前

    我想说的是,在这一点上,你是在测试基础设施。如果您想检查过滤器是否应用于您期望的方法中,那么使用reflection+match列出您期望匹配的方法。

    如果要测试动作过滤器,请直接使用它。也许你真正需要的是确保不同的结果/模型与过滤器一起工作。