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
в тестовой настройке.