【问题标题】:Unit testing all controllers from a single test从单个测试中对所有控制器进行单元测试
【发布时间】:2010-09-22 21:40:06
【问题描述】:

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

我认为真正有用的单元测试是循环遍历每个控制器并验证是否满足某些条件,然后操作过滤器将影响结果。

创建一个针对多个控制器的单元测试是否明智?任何人都可以分享已证明有用的类似测试的代码吗?

编辑:刚刚意识到testing an action filter 可能有问题。不过,如果您有关于控制器大规模测试的想法要分享...

【问题讨论】:

    标签: asp.net-mvc unit-testing controller action-filter


    【解决方案1】:

    不建议在测试中一次测试一个以上的东西。

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

    许多简单、易读、因此可维护的测试,每个只测试一件事,远比一项复杂的测试好得多。

    回复您的编辑

    测试过滤器可以通过将过滤器与属性分离来实现。这是一个示例: 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】:

      由于您很可能无论如何都会为每个控制器编写单元测试,因此您总是可以只使用一个单元测试基类来测试动作过滤器。任何使用动作过滤器的控制器测试都将从这个类继承来测试动作过滤器。

      【讨论】:

        【解决方案3】:

        我会说那时您正在测试基础架构。如果您想检查过滤器是否应用于您期望的方法,然后使用反射 + 匹配您期望匹配的方法列表。

        也许您确实想检查方法是否具有特定签名,上述方法也适用。

        如果你想测试动作过滤器,直接反对它。也许您真正需要的是确保不同的结果/模型适用于过滤器。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-06-02
          • 2015-04-03
          • 1970-01-01
          • 2012-04-24
          • 2017-04-26
          • 2018-09-19
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多