Как протестировать контроллер с атрибутом Authorize и внедрением зависимостей IoC? - PullRequest
0 голосов
/ 22 февраля 2010

Я принял проект ASP.NET MVC от коллеги. У меня есть только элементарные знания как ASP.NET MVC, так и модульного тестирования.

Я пытаюсь встать на правую ногу, создавая юнит-тесты. Я думал, что начну с тестирования контроллера. К сожалению, я наткнулся на первое препятствие! Рассматриваемый контроллер имеет атрибут Authorize и зависимости, которые вводятся посредством внедрения зависимостей (Unity).

Контроллер выглядит примерно так:

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?

Спасибо.

Алан Т

Ответы [ 2 ]

2 голосов
/ 23 февраля 2010

Вы не должны проверять сам атрибут, скорее вы должны проверить, объявлен ли атрибут на контроллере с помощью отражения.

Подумайте об этом так: если вы реализовали свой собственный атрибут Authorize, вы должны написать тесты в код атрибута, чтобы убедиться, что он работает. Когда вы позже использовали его на своих контроллерах, вы уже протестировали функциональность атрибута и просто должны знать, использует ли его контроллер.

И зависимости, которые вы создаете через вашу любимую среду Mock и внедряете, как подсказывает Маттиас.

1 голос
/ 22 февраля 2010

Вам не нужно заботиться об атрибуте Authorize, так как он находится в рамках asv.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 для внедрения зависимостей в свои тесты.

...