Я сделал поиск по SO и, похоже, этот вопрос задается довольно часто. Я был в состоянии заставить mocks работать, и я также могу выполнить OnActionExecuted() без каких-либо проблем. Вот мой модульный тест. Прокомментированные строки - это те, которые терпят неудачу, и я уверен, что я не издеваюсь над правильным типом.Unit Testing Action Filters - Как насмехаться ViewResult
//Arrange
//var viewResult = new ViewResult();
var filterContextMock = new Mock<ActionExecutedContext>();
var routeData = new RouteData();
var httpContextMock = new Mock<HttpContextBase>();
routeData.Values["data"] = "Mock data";
var requestContext = new RequestContext(httpContextMock.Object, routeData);
var controller = new FakeController();
controller.ControllerContext = new ControllerContext(requestContext, controller);
filterContextMock.Setup(f => f.RouteData).Returns(routeData);
filterContextMock.Setup(f => f.Controller).Returns(controller);
//filterContextMock.Setup(f => f.Result).Returns(viewResult);
//Act
var wrapFilterAttribute = new WrapFilterAttribute();
wrapFilterAttribute.OnActionExecuted(filterContextMock.Object);
Вот мой фильтр действий.
public class WrapFilterAttribute : ActionFilterAttribute
{
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
var view = (ViewResultBase)filterContext.Result;
if (view != null)
{
BaseViewModel viewModel = (BaseViewModel)view.ViewData.Model ?? new BaseViewModel();
viewModel.Wrap = new WrapperFactory().GetWrap();
}
base.OnActionExecuted(filterContext);
}
}
Проблема, с которой я столкнулся, это filterContext.Result всегда приходит как EmptyResult. Вместо этого я хотел бы использовать гидратированный ViewResult. Любые идеи, как я могу это сделать?
Большое спасибо!
Спасибо за рефакторинг моего дрянного кода Дарин. Это сработало для меня. Еще раз спасибо :) – Praveen
Ваш комментарий о введении WrapperFactory в конструктор фильтра действий вызывает у меня любопытство. Как бы вы выполнили отправку в экземпляр WrapperFactory через WrapFilterAttribute? AFAIK, атрибуты требуют значений времени компиляции (константы и т. Д.). – Praveen
@Praveen, вот пример того, как достичь [инъекции конструктора с фильтрами действия] (http://iridescence.no/post/Constructor-Injection-for-ASPNET-MVC-Action-Filters.aspx). Это немного хаки, но это единственный способ на данный момент. Это было улучшено в ASP.NET MVC 3. –