如何测试IoC具有Authorize属性和依赖注入的控制器?

时间:2010-02-22 17:13:07

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

我从一位同事那里接管了一个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如何测试Index操作?

感谢。

Alan T

2 个答案:

答案 0 :(得分:2)

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

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

您通过自己喜欢的Mock框架创建的依赖关系并以Mattias身份注入。

答案 1 :(得分:1)

您不应该关心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容器在测试中注入依赖项。