asp.net – 单元测试操作过滤器 – 如何模拟ViewResult
发布时间:2020-12-15 20:54:47 所属栏目:asp.Net 来源:网络整理
导读:我在SO上进行了搜索,看起来这个问题经常被问到.我已经能够使模拟工作,我也能够执行OnActionExecuted()而没有任何问题.这是我的单元测试.评论的行是失败的,我敢肯定我没有嘲笑正确的类型. //Arrange //var viewResult = new ViewResult(); var filterContextM
我在SO上进行了搜索,看起来这个问题经常被问到.我已经能够使模拟工作,我也能够执行OnActionExecuted()而没有任何问题.这是我的单元测试.评论的行是失败的,我敢肯定我没有嘲笑正确的类型.
//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.我有什么想法可以做到这一点? 非常感谢! 解决方法
首先让我们从修复你的动作过滤器开始,因为当前代码看起来很糟糕,这些演员可能会让你头疼:
public class WrapFilterAttribute : ActionFilterAttribute { public override void OnActionExecuted(ActionExecutedContext filterContext) { var view = filterContext.Result as ViewResultBase; if (view != null) { // the controller action returned a ViewResultBase var viewModel = view.ViewData.Model as BaseViewModel; if (viewModel != null) { // the model passed to the view was derived from // BaseViewModel so we can safely update the Wrap // property viewModel.Wrap = new WrapperFactory().GetWrap(); } } base.OnActionExecuted(filterContext); } } 单元测试: // arrange var sut = new WrapFilterAttribute(); var filterContextMock = new Mock<ActionExecutedContext>(); var viewResultMock = new Mock<ViewResultBase>(); filterContextMock.Object.Result = viewResultMock.Object; var viewModel = new BaseViewModel(); viewResultMock.Object.ViewData.Model = viewModel; // act sut.OnActionExecuted(filterContextMock.Object); // assert // TODO: assert something on the viewModel.Wrap property like // for example that it has been initialized 备注:您的动作过滤器对WrapperFactory类有很强的依赖性.这个不好.进一步的改进是将此功能抽象为一个接口,该接口将被注入动作过滤器的构造函数中.这将允许您进一步分离应用程序的不同层之间的关注点. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- asp.net – web.config和app.config混淆
- asp.net-mvc-4 – ASP.NET Active Directory搜索
- asp.net mvc jquery ui datepicker绑定问题
- asp.net-core – Microsoft Application Insights是否支持M
- asp.net – 如何在.net WebApi2应用程序中使用OAuth2令牌请
- 向asp.net添加样式表(使用Visual Studio 2010)
- asp.net核心 – 在ASP.NET Core的WebDeploy期间,无法找到匹
- 如何在asp.net中删除动态创建的控件
- asp.net-mvc – 使用自己的HtmlHelper扩展名用于模型绑定的
- C#_.Net Core 3.1 WebAPI_Excel数据读取与写入_自定义解析封
推荐文章
站长推荐
- asp.net-mvc-5 – 更改消息“密码必须至少包含一
- asp.net – 如何在经典的asp中使用.net共享会话?
- asp.net-mvc-3 – 为什么抛出NULL值异常?
- asp.net-mvc – 表达式树可能不包含动态操作 –
- asp.net-mvc – 在OWIN登录上检索用户的Facebook
- asp.net – DropDownList获取底层对象
- asp.net-mvc – ASP.NET MVC:从控制器返回CDN图
- asp.net-mvc-2 – RedirectToRouteResult如何工作
- asp.net-mvc – 想从mvc使用index.html
- asp.net – 检测Internet Explorer浏览器版本问题
热点阅读