So I'm overriding OnActionExecuted in my BaseController class to set the CurrentUser property of a BaseViewModel. I'd like to be able to unit test this, but can't figure out how.
Here's the code:
protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
if (filterContext.Result is ViewResult && ((ViewResult)filterContext.Result).ViewData.Model != null)
{
((BaseViewModel)((ViewResult)filterContext.Result).ViewData.Model).CurrentUser = CurrentUser;
}
base.OnActionExecuted(filterContext);
}
And here's the test:
BaseController controller = new BaseController();
Mock<ActionExecutedContext> MockActionExecutedContext = new Mock<ActionExecutedContext>();
MockActionExecutedContext.Setup(ctx => ctx.Result).Returns(new ViewResult());
controllerAccessor.OnActionExecuted(MockActionExecutedContext.Object);
ViewResult vr = MockActionExecutedContext.Object.Result as ViewResult;
BaseViewModel model = vr.ViewData.Model as BaseViewModel;
User currentUser = model.CurrentUser;
Assert.NotNull(currentUser);
When I run the test, I'm getting the error:
System.NotSupportedException : Invalid setup on a non-virtual member: ctx => ctx.Result
I know I could just test for the property in the unit tests of every derived controller, but there must be a cleaner way to do this. Any ideas?