Можно ли проверить переопределение для OnAuthorization в базовом классе контроллера ASP.NET MVC? - PullRequest
3 голосов
/ 17 февраля 2010

Механика выполнения этой работы не сложна, но тестирование немного странно. Сценарий заключается в том, что я хочу вывести некоторые базовые пользовательские данные в данные представления на основе свойства User базового контроллера (объект IPrincipal), чтобы основная страница всегда имела его. Мне нужен доступ к моему IUserManager (класс обслуживания), который предоставляется пользовательским DI на фабрике контроллеров. Насмешка над пользователем не проблема для тестирования. Однако самый простой способ добиться этого для каждого действия в базовом контроллере - это переопределить метод OnAuthorization. Базовый класс выглядит следующим образом:

public abstract class BaseController : Controller
{
    public BaseController(IUserManager userManager)
    {
        UserManager = userManager;
    }

    public IUserManager UserManager { get; private set; }

    protected override void OnAuthorization(AuthorizationContext filterContext)
    {
        base.OnAuthorization(filterContext);
        UserManager.SetupUserViewData(User, ViewData);
    }
}

Проблема в том, что я не смог найти в тесте способ запустить метод OnAuth. Я хотел бы проверить в своем макете UserManager, что вызывается SetupUserViewData. Я не использую пользовательский фильтр, потому что у меня нет полноценной структуры внедрения зависимостей (фильтр должен получить IUserManager).

Есть предложения? Поскольку это будет использоваться везде, я бы хотел, чтобы тестирование было правильным.

1 Ответ

8 голосов
/ 17 февраля 2010

Вы можете сделать это, создав класс, который наследуется от вашего базового контроллера, с помощью открытого метода, который вызывает ваш метод OnAuthorization. Примерно так:

public class TestController : BaseController {
    public TestController(IUserManager userManager) : base(userManager) {
    }

    public void CallOnAuthorization(AuthorizationContext filterContext) {
        OnAuthorization(filterContext);
    }
}

Затем вы тестируете что-то вроде этого:

[Test]
public void TestMethod() {
    var userManager = //Mock usermanager;
    var filterContext = //Mock AuthorizationContext;
    var controller = new TestController(userManager);
    controller.CallOnAuthorization(filterContext);
    //Assert here
}
...