Tôi đã thực hiện tìm kiếm trên SO và có vẻ như câu hỏi này được hỏi khá thường xuyên. Tôi đã có thể nhận được các mocks làm việc và tôi cũng có thể thực hiện OnActionExecuted() mà không có bất kỳ vấn đề. Đây là Bài kiểm tra đơn vị của tôi. Các dòng nhận xét là những dòng thất bại và tôi chắc chắn rằng tôi không chế nhạo đúng loại.Đơn vị kiểm tra bộ lọc hành động - Làm thế nào để chế tạo 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);
Đây là bộ lọc hành động của tôi.
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);
}
}
Vấn đề tôi đang gặp phải ở đây là filterContext.Result luôn xuất hiện dưới dạng EmptyResult. Tôi muốn đẩy vào một ViewResult ngậm nước thay thế. Bất kỳ ý tưởng làm thế nào tôi có thể thực hiện điều này?
Rất cám ơn!
Cảm ơn bạn đã tái cấu trúc mã độc của tôi Darin. Điều này làm việc cho tôi. Cảm ơn một lần nữa :) – Praveen
bình luận của bạn về tiêm WrapperFactory vào constructor bộ lọc hành động làm cho tôi tò mò. Làm thế nào bạn sẽ thực hiện việc gửi trong một thể hiện của WrapperFactory thông qua trang trí WrapFilterAttribute? AFAIK, các thuộc tính yêu cầu các giá trị biên dịch-thời gian (hằng số vv). – Praveen
@Praveen, đây là một ví dụ về cách đạt được [constructor injection với bộ lọc hành động] (http://iridescence.no/post/Constructor-Injection-for-ASPNET-MVC-Action-Filters.aspx). Đó là một chút hacky nhưng đó là cách duy nhất cho thời điểm này. Điều này đã được cải thiện trong ASP.NET MVC 3. –