Пользовательский фильтр MVC, вызовите конвейерное событие ASP.NET вручную для модульного теста - PullRequest
0 голосов
/ 23 декабря 2011
public abstract class MyControllerBase : Controller
{
    protected override void OnActionExecuting(ActionExecutingContext context)
    {
        // do some magic
    }
}

Все мои контроллеры наследуются от MyControllerBase. Проблема в том, что теперь я не могу выполнить модульное тестирование определенных методов, потому что фильтр устанавливает некоторые флаги авторизации / логики, которые влияют на путь кода.

Есть ли способ вручную вызвать OnActionExecuting? Как конвейер вызывает эти события?

РЕДАКТИРОВАТЬ: , чтобы показать немного больше идеи этого дизайна в ответ на комментарии. У меня в принципе есть что-то вроде этого:

public abstract class MyControllerBase : Controller
{
    protected override void OnActionExecuting(ActionExecutingContext context)
    {
        UserProperties = 
             _userService
                .GetUserProperties(filterContext.HttpContext.User.Identity.Name);

        ViewBag.UserProperties = UserProperties;
    }

    public UserProperties { get; private set; }

    public bool CheckSomethingAboutUser()
    {
         return UserProperties != null 
            && UserProperties.IsAuthorisedToPerformThisAction;
    }

    // ... etc, other methods for querying UserProperties
}

Так что теперь в любом месте в View или Controller я могу получить информацию о текущем пользователе, какова его электронная почта, какое разрешение у них есть, в каком отделе они работают и т.д.

Пример:

public class PurchasingController : MyControllerBase 
{
    public ActionResult RaisePurchaseOrder(Item item)
    {
        // can use UserProperties from base class to determine correct action...

        if (UserProperties.CanRaiseOrders)

        if (UserProperties.Department == item.AllocatedDepartment)
    }
}

Так что этот дизайн действительно хорош, но, как вы можете видеть, тестирование вышеописанного действия затруднительно, так как я не могу напрямую манипулировать UserProperties в тестовой настройке.

1 Ответ

2 голосов
/ 23 декабря 2011

Я не уверен, что вы предполагаете переопределить OnActionExecuting, как в MCV, обычно я создаю ActionFilterAttribute

public class SomeMagicAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {

    }
}

Тогда ваш класс:

[SomeMagic]
public abstract class MyControllerBase : Controller
{

}

Тогда в своем модульном тесте вы можете просто сделать

var magic = new SomeMagicAttribute();
var simulatedContext = new ActionExecutingContext();
magic.OnActionExecuting(simulatedContext);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...