1

我的目标是IAuthorizationFilter通过子类化AuthorizeAttribute和覆盖来创建 MVC 的自定义实现bool AuthorizeCore(HttpContextBase httpContext);

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

另外,我想像这样使用 ninject注入构造函数的某些参数。

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

这是我的属性设置:

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")]on 动作的模拟类,然后像这样调用它:

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

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

老实说,我不知道如何进行。

4

1 回答 1

0

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

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

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

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

您可以查看 AuthorizeAttribute 的源代码以了解它在做什么......这样您就知道要断言什么。

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

于 2014-02-03T03:28:18.327 回答