Zrobiłem wyszukiwanie w SO i wygląda na to, że to pytanie jest często zadawane. Udało mi się sprawić, że mocky działają, a ja też mogę wykonywać OnActionExecuted() bez żadnych problemów. Oto mój test jednostkowy. Skomentowane linie to te, które zawiodły i jestem pewien, że nie kpię z właściwego typu.Jednostki testujące filtry akcji - jak kpić z 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);
Oto mój filtr działania.
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);
}
}
Kwestia, przed którą stoję, to filterContext.Result zawsze pojawia się jako EmptyResult. Chciałbym zamiast tego wepchnąć uwodniony ViewResult. Jakieś pomysły, jak mogę to osiągnąć?
Wielkie dzięki!
Dzięki za refaktoryzację mojego brzydkiego kodu Darin. To działało dla mnie. Jeszcze raz dziękuję :) – Praveen
Twój komentarz na temat wstrzykiwania WrapperFactory do konstruktora filtru akcji sprawia, że jestem ciekawy. Jak można przesłać instancję WrapperFactory poprzez dekorację WrapFilterAttribute? AFAIK, atrybuty wymagają wartości czasu kompilacji (stałe itp.). – Praveen
@Praveen, oto przykład, jak uzyskać [konstruktor wtrysku z filtrami akcji] (http://iridescence.no/post/Constructor-Injection-for-ASPNET-MVC-Action-Filters.aspx). To trochę hacky, ale to jedyny sposób na tę chwilę. Zostało to ulepszone w ASP.NET MVC 3. –