通过单次测试对所有控制器进行单元测试

时间:2010-09-22 21:40:06

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

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

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

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

编辑:刚认识到testing an action filter可能存在问题。如果你有想法分享控制器的质量测试......

3 个答案:

答案 0 :(得分:3)

不建议在测试中一次测试多个东西。

你还应该避免测试中的逻辑(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();
}

答案 1 :(得分:2)

由于你最有可能为每个控制器编写单元测试,你总是可以拥有一个测试动作过滤器的单元测试基类。使用动作过滤器的任何控制器测试都将从此类继承,以测试动作过滤器。

答案 2 :(得分:1)

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

也许你确实想检查这些方法是否具有某种特征,上述内容也适用于此。

如果要测试操作过滤器,请直接对其进行测试。也许您真正需要的是确保不同的结果/模型与过滤器一起使用。