【问题标题】:How do I test a controller that has an Authorize attribute and dependencies injection by IoC?如何通过 IoC 测试具有 Authorize 属性和依赖项注入的控制器?
【发布时间】:2010-02-22 17:13:07
【问题描述】:

我从同事那里接手了一个 ASP.NET MVC 项目。我对 ASP.NET MVC 和单元测试只有初步的了解。

我正试图通过创建单元测试来走上正轨。我想我会从测试控制器开始。不幸的是,我在第一个障碍时绊倒了!有问题的控制器具有通过依赖注入 (Unity) 注入的 Authorize 属性和依赖项。

控制器看起来像:

namespace Project.Controllers
{
    [Authorize( Roles = "Admin,PurchaseOrderUser" )]
    public class SomeController : Controller
    {
        private readonly IOrganisationService _organisationService;
        private readonly IPurchaseOrderService _purchaseOrderService;

        // Dependency injection will provide these
        public SomeController(
            IPurchaseOrderService purchaseOrderService,
            IOrganisationService organisationService)
        {
            _purchaseOrderService = purchaseOrderService;
            _organisationService = organisationService;
        }

        // List Purchase Orders
        public ActionResult Index( )
        {
            Return View();
        }

        // Rest of controller....

那么,如何使用 nUnit 和 Rhino Mock Mocks 测试索引操作?

谢谢。

艾伦·T

【问题讨论】:

  • 我看不出两者有什么关系?
  • 相关(单元测试与 Authorize 属性):stackoverflow.com/questions/2296930/…
  • Krzysztof - 我并不是要暗示这两者是相关的。我只是在设置我必须处理的场景。
  • 不知道我是否从错误的角度看待它,但我想测试授权是否有效以及索引操作是否有效。我认为这是两个不同的测试。我见过 cmets 说忽略属性,只测试控制器。我想两者都做错了吗?请记住,我不是一个经验丰富的程序员,所以请对我温柔一点。

标签: asp.net-mvc dependency-injection rhino-mocks


【解决方案1】:

您不应该测试属性本身,而应该测试该属性是否通过反射在控制器上声明。

这样想,如果你实现了自己的 Authorize-attribute,你应该为属性代码编写测试,看看它是否有效。当您稍后在控制器上使用它时,您已经测试了该属性的功能,只需要知道控制器是否正在使用它。

以及您通过自己喜欢的 Mock 框架创建的依赖项,并按照 Mattias 的建议进行注入。

【讨论】:

    【解决方案2】:

    您不应该关心 Authorize 属性,因为它位于 asp.net mvc 框架中,您必须假设该框架已经过测试。您只需要担心依赖关系。这非常简单,因为您需要做的就是创建依赖项的模拟实例,然后用它们实例化一个新控制器。像这样的:

    [Test]
    public void TestMethod() {
        var organisationService = MockRepository.GenerateMock<IOrganisationService>();
        var purchaseOrderService = MockRepository.GenerateMock<IPurchaseOrderService>();
        //Setup your mocks
        var controller = new SomeController(organisationService, purchaseOrderService);
        var result = controller.Index();
        //Your asserts
    }
    

    您不会使用您的 ioc 容器在测试中注入依赖项。

    【讨论】:

    • 谢谢 Mattias,我已经尝试过了。
    • Mattias,我想测试不同的用户是否被授予/未授予访问权限。你说把它留给框架。我们不需要对授权进行单元测试吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-03
    • 1970-01-01
    • 1970-01-01
    • 2018-10-31
    • 2017-06-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多