如何在asp.net mvc中模拟AuthorizeAttribute?

时间:2009-10-05 05:39:10

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

我有自己的自定义授权属性,我正在尝试检查我的控制器方法,看看他们是否具有正确的角色。现在我的自定义授权标签中包含数据库代码。

我嘲笑它的方式似乎不起作用,因为我发现的反射内容似乎只是传递没有参数所以我在Authorize Attribute中的默认构造函数被创建一个新的服务层对象来创建一个存储库对象(这会杀死单元测试)。

 var indexAction = typeof(Controller).GetMethod(method);
        var authorizeAttributes = indexAction.GetCustomAttributes(typeof(AuthorizeAttribute), true);

        //Assert
        Assert.That(authorizeAttributes.Length > 0, Is.True);

        foreach (AuthorizeAttribute att in authorizeAttributes)
        {
            Assert.That(att.Roles, Is.EqualTo(roles));
        }

我的AutorizeAttribute的构造函数

  public MyAuthorize()
    {
        authorize = new ServiceLayer();
    }

    public MyAuthorize(IServicelayer layer)
    {
        authorize = layer;
    }

反射内容不断调用我的默认构造函数。我如何传递模拟服务层或什么?

由于

2 个答案:

答案 0 :(得分:1)

你看过一些Mocking Frameworks吗?我过去曾用这些来伪造http上下文等。

这是另一个可能能够帮助你的Stack Overflow帖子......

https://stackoverflow.com/questions/37359/what-c-mocking-framework-to-use

答案 1 :(得分:0)

我认为问题不在于您的代码,而在于您要测试的内容。是什么决定了该属性的角色?

如果您是根据传递给属性的内容从服务层检索角色,那么您的测试应该确认该属性是否存在于它正在保护的操作(控制器测试的一部分),相应的调用是针对您的来自属性的服务层(属性测试的一部分),以及服务层返回特定请求的适当值(控制器测试的一部分)。

为了确保所有部分协同工作,您需要使用基本上模仿整个请求管道的集成测试 - 像Steve Sanderson的MvcIntegrationTest应该简化这个http://blog.codeville.net/2009/06/11/integration-testing-your-aspnet-mvc-application/