AuthorizeAttribute单元测试依赖注入

时间:2014-02-03 01:46:41

标签: c# asp.net-mvc unit-testing ninject asp.net-mvc-filters

我的目标是通过继承IAuthorizationFilter并覆盖AuthorizeAttribute

来创建MVC bool AuthorizeCore(HttpContextBase httpContext);的自定义实现

作为我的时髦,我想做这种TDD风格 (仅仅因为我说我是一个时髦并不意味着你可以导航回来。是的,我看到了。)

此外,我想注入构造函数的某些参数using ninject like so

所以,我的问题是如何对这样的设置进行单元测试?

这是我的属性设置:

public class MyAuthorize : FilterAttribute {

    public MyAuthorize(params string[] Activities)
    {
        this.RequestedActivities = Activities.ToList();
    }
    public IEnumerable<string> RequestedActivities { get; set; }
}

public class MyAuthorizeFilter : AuthorizeAttribute
{
    private readonly IEnumerable<string> _RequestingActivities;
    private readonly IUserService _UserService;

    public MyAuthorizeFilter(IUserService UserService, IEnumerable<string> Activities) 
    {
        this._RequestingActivities = Activities;
        _UserService = UserService;
    }

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        return (_RequestingActivities.All(c=>c == "Permitted"));
    }
}

我试图测试void OnAuthorization(AuthorizationContext filterContext);公开的AuthorizeAttribute方法,但没有任何东西可以断言。 filterContext没有以任何明显的方式改变。

我的下一步是在一个动作上创建一个带有[MyAuthorize("APermission")]的模拟类,然后像这样调用它:

controller.ActionInvoker.InvokeAction(controller.ControllerContext, "Permitted");

但是因为我实际上并没有使用MyAuthorizeFilter,所以它不会调用实际进行授权检查的代码。

老实说,我不知道如何继续。

1 个答案:

答案 0 :(得分:0)

请记住,当您进行单元测试时,您不会测试连接和调用属性等实现。您正在测试实际属性的功能。

所以你需要做的就是实例化你的MyAuthorize类,可能会传递模拟的服务和活动。然后,您只需调用将由框架调用的方法,并验证是否已实现正确的结果。

在这种情况下,你可能只是调用MyAuthorize.OnAuthorization()传入一个模拟的授权上下文,并检查filterContext.Response对象的状态,如果它成功并将包含一个Unauthorized(401),它将保持不变。如果它失败了。

如果filterContext为null或未正确配置,它也可能抛出异常。

您可以查看AuthorizeAttribute的源代码,看看它在做什么......所以你知道要断言什么。

http://aspnetwebstack.codeplex.com/SourceControl/latest#src/System.Web.Mvc/AuthorizeAttribute.cs